【学习笔记】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;
}
相关推荐
chao_7897 分钟前
手撕算法(定制整理版2)
笔记·算法
灰原A1 小时前
摆脱拖延症的详细计划示例
笔记
虾球xz2 小时前
游戏引擎学习第276天:调整身体动画
c++·学习·游戏引擎
虾球xz2 小时前
游戏引擎学习第275天:将旋转和剪切传递给渲染器
c++·学习·游戏引擎
qq_386322693 小时前
华为网路设备学习-21 IGP路由专题-路由过滤(filter-policy)
前端·网络·学习
J先生x3 小时前
【IP101】图像处理进阶:从直方图均衡化到伽马变换,全面掌握图像增强技术
图像处理·人工智能·学习·算法·计算机视觉
虾球xz7 小时前
游戏引擎学习第268天:合并调试链表与分组
c++·学习·链表·游戏引擎
Y3174298 小时前
Python Day23 学习
python·学习
song_ly0018 小时前
深入理解软件测试覆盖率:从概念到实践
笔记·学习·测试
DIY机器人工房9 小时前
[6-2] 定时器定时中断&定时器外部时钟 江协科技学习笔记(41个知识点)
笔记·stm32·单片机·学习·江协科技