rt,[P1050]。(https://www.luogu.com.cn/problem/P1050)
#include<cstdio>
#include<cstring>
using namespace std;
const int K=110;
int k,ln,n[K],ans[K]={1},mul[K],n1[K],pow[K];
bool flag;
char sn[K];
int main(){
scanf("%s%d",sn,&k);
ln=strlen(sn);
for(int i=0;i<k&&ln-i-1>=0;i++)mul[i]=n[i]=sn[ln-i-1]-'0';
for(int i=0;i<k;i++){
for(int j=0;j<k;j++)n1[j]=n[j],pow[j]=!j;
int cnt=0;
do{
for(int j=k-1;j>=0;j--){
n1[j]*=mul[0];
for(int l=j-1;l>=0;l--)n1[j]+=n1[l]*mul[j-l];
}
for(int i=0;i+1<k;i++)n1[i+1]+=n1[i]/10,n1[i]%=10;
n1[k-1]%=10;
for(int j=k-1;j>=0;j--){
pow[j]*=mul[0];
for(int l=j-1;l>=0;l--)pow[j]+=pow[l]*mul[j-l];
}
for(int i=0;i+1<k;i++)pow[i+1]+=pow[i]/10,pow[i]%=10;
cnt++;
if(cnt>10){
printf("-1");
return 0;
}
}while(n1[i]!=n[i]);
for(int i=0;i<k;i++)ans[i]*=cnt;
for(int i=0;i+1<k;i++)ans[i+1]+=ans[i]/10,ans[i]%=10;
ans[k-1]%=10;
for(int i=0;i<k;i++)mul[i]=pow[i];
}
for(int i=k-1;i>=0;i--)
if(flag||ans[i])flag=true,printf("%d",ans[i]);
return 0;
}
Hack 数据:
输入:
4258161756319813789273201815945700206240682325082659165160258449299542088911212464353263203289007789 85
正确输出:
500000000000000000000000000000000000000000000000000000000000000000000000000000000000
我的输出:
100000000000000000000000000000000000000000000000000000000000000000000000000000000000