可以做
首先要做过这道题 [AGC061E] Increment or XOR
考虑记录个位上的数字以及末尾 0 0 0的个数,发现每次加的数 < 10 <10 <10,因此每次向高位进位时末尾 0 0 0的数目都会增加,这样不会超过 log m \log m logm轮
发现模完 m m m后的数一定 < 10 <10 <10,因此存在循环节,直接模拟即可
#include
#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;
}