【学习笔记】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 分钟前
Rust ndarray 高性能计算:从元素操作到矩阵运算的优化实践
人工智能·笔记·rust
霜绛19 分钟前
Unity:lua热更新(一)——AB包AssetBundle、Lua语法
笔记·学习·游戏·unity·lua
霜绛20 分钟前
Unity:lua热更新(二)——Lua语法(续)
笔记·学习·unity·游戏引擎·lua
py有趣1 小时前
LeetCode算法学习之数组中的第K个最大元素
学习·算法·leetcode
YangYang9YangYan1 小时前
职业本科发展路径与规划指南
大数据·人工智能·学习·数据分析
YuforiaCode2 小时前
黑马Python+AI大模型开发课程笔记(个人记录、仅供参考)
笔记
lkbhua莱克瓦242 小时前
Java练习——数组练习
java·开发语言·笔记·github·学习方法
AA陈超2 小时前
ASC学习笔记0010:效果被应用时的委托
c++·笔记·学习
AA陈超2 小时前
ASC学习笔记0004:通知相关方能力规格已被修改
c++·笔记·学习·游戏·ue5·游戏引擎·虚幻
hadage2333 小时前
--- git 笔记 ---
笔记·git·elasticsearch