【学习笔记】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;
}
相关推荐
_落纸2 天前
三大基础无源电子元件——电阻(R)、电感(L)、电容(C)
笔记
Alice-YUE2 天前
【CSS学习笔记3】css特性
前端·css·笔记·html
2303_Alpha2 天前
SpringBoot
笔记·学习
萘柰奈2 天前
Unity学习----【进阶】TextMeshPro学习(三)--进阶知识点(TMP基础设置,材质球相关,两个辅助工具类)
学习·unity
沐矢羽2 天前
Tomcat PUT方法任意写文件漏洞学习
学习·tomcat
好奇龙猫2 天前
日语学习-日语知识点小记-进阶-JLPT-N1阶段蓝宝书,共120语法(10):91-100语法+考え方13
学习
向阳花开_miemie2 天前
Android音频学习(十八)——混音流程
学习·音视频
工大一只猿2 天前
51单片机学习
嵌入式硬件·学习·51单片机
c0d1ng2 天前
量子计算学习(第十四周周报)
学习·量子计算
Hello_Embed2 天前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件