【学习笔记】Baekjoon-23510 Wise man

可以做😅

首先要做过这道题 [AGC061E] Increment or XOR

考虑记录个位上的数字以及末尾 0 0 0的个数,发现每次加的数 < 10 <10 <10,因此每次向高位进位时末尾 0 0 0的数目都会增加,这样不会超过 log ⁡ m \log m logm轮

发现模完 m m m后的数一定 < 10 <10 <10,因此存在循环节,直接模拟即可

cpp 复制代码
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define ll long long
using namespace std;
ll a,m,n;
int to[10][65][10];
ll f[10][65][10],fac[20];
int calc(ll x){
    int mx=0;while(x)mx=max(mx,(int)(x%10)),x/=10;
    return mx;
}
void work(){
    if(a==0){
        cout<<0;
        exit(0);
    }
    while(n&&a<10){
        a+=calc(a),n--;
        if(a>=m)return;
    }
    if(a==0){
        cout<<0;
        exit(0);
    }
    if(n==0){
        cout<<a;
        exit(0);
    }
    int i=1;while(a/fac[i]%10==0)i++;
    int x=calc(a/10);
    while(i&&(a-a%10+fac[i]+to[x][i-1][a%10]>=m||n<f[x][i-1][a%10])){
        i--;
    }
    if(i>0){
        n-=f[x][i-1][a%10],a=a-a%10+fac[i]+to[x][i-1][a%10];
    }
    else{
        while(n&&a<m){
            a+=calc(a),n--;
        }
    }
}
void solve(){
    while(n&&a<m)work();
    a%=m;
}
ll v[10];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>a>>m>>n,n--;fac[0]=1;for(int i=1;i<=18;i++)fac[i]=fac[i-1]*10;
    for(int j=0;j<=60;j++){
        for(int i=0;i<10;i++){
            for(int k=0;k<10;k++){
                if(i==0&&k==0)continue;
                if(j==0){
                    int x=k,s=0;
                    while(x<10)x+=max(x,i),s++;
                    to[i][j][k]=x%10,f[i][j][k]=s;
                }
                else{
                    int x=k;ll s=0;
                    for(int l=0;l<=9;l++){
                        s+=f[max(i,l)][j-1][x],x=to[max(i,l)][j-1][x];
                    }to[i][j][k]=x,f[i][j][k]=s;
                }
            }
        }
    }
    solve();
    while(n){
        if(v[a]){
            n%=v[a]-n;
            break;
        }
        v[a]=n;
        solve();
    }
    while(n){
        solve();
    }
    cout<<a;
}
相关推荐
近津薪荼3 分钟前
dfs专题5——(二叉搜索树中第 K 小的元素)
c++·学习·算法·深度优先
方安乐7 分钟前
科普:股票 vs 债券的区别
笔记
敏叔V58740 分钟前
AI智能体的工具学习进阶:零样本API理解与调用
人工智能·学习
2501_941864961 小时前
科学方法论破解学习时间堆砌误区
学习
傻小胖2 小时前
22.ETH-智能合约-北大肖臻老师客堂笔记
笔记·区块链·智能合约
1024小神2 小时前
SVG标签中path路径参数学习
学习
浅念-2 小时前
C++入门(2)
开发语言·c++·经验分享·笔记·学习
ZH15455891312 小时前
Flutter for OpenHarmony Python学习助手实战:面向对象编程实战的实现
python·学习·flutter
简佐义的博客3 小时前
生信入门进阶指南:学习顶级实验室多组学整合方案,构建肾脏细胞空间分子图谱
人工智能·学习
近津薪荼3 小时前
dfs专题4——二叉树的深搜(验证二叉搜索树)
c++·学习·算法·深度优先