题解:
迭代,一次次k累加计算
代码:
#include<bits/stdc++.h> using namespace std; const int N=10005; int n,a[N],b[N],c[2][N],ans[N]; char s[N]; bool same(int p[],int q[],int x) { for(int i=1;i<=x;i++) if(p[i]!=q[i])return 0; return 1; } void multi_1(int x) { int last=0; for(int i=1;i<=ans[0];i++) { ans[i]=ans[i]*x+last; last=ans[i]/10;ans[i]%=10; } if(last>0)ans[++ans[0]]=last; } void multi_2(int w[],int p[],int q[]) { int i,last=0; w[0]=min(p[0]+q[0]-1,n); for(int k=1;k<=w[0];k++) { for(w[k]=last,i=1;i<=p[0];i++) if(k+1-i>=1&&k+1-i<=q[0])w[k]+=p[i]*q[k+1-i]; last=w[k]/10,w[k]%=10; } if(last)w[++w[0]]=last; } int get(int x) { memcpy(c[0],b,sizeof(b)); for(int i=1;i<=10;i++) { multi_2(c[i&1],c[i&1^1],b); if(same(c[i&1],b,x)) { multi_2(c[i&1],c[i&1^1],a); if(!same(c[i&1],a,x))goto d1; memcpy(b,c[i&1^1],sizeof(c[0])); return i; } } d1:puts("1"); exit(0); } int main() { scanf("%s%d",s,&n); a[0]=strlen(s),n=min(a[0],n); for(int i=1;i<=n;i++)a[i]=s[a[0]-i]-'0'; memcpy(b,a,sizeof(a)); ans[0]=1;ans[1]=1; for(int i=1;i<=n;i++)multi_1(get(i)); ans[1]++; int j=1; while (ans[j]==10) { ans[j+1]++; ans[j]=0; j++; } if (ans[ans[0]+1])ans[0]++; for(int i=ans[0];i;i--)printf("%d",ans[i]); }