此题放到提高组感觉都好难……至少以我高一结束时的水平是无法做出来的……
思维难度十分大。
要保证后k位答案相同,首先得保证后(k-1)位答案相同,于是先处理后(k-1)位,以此类推……于是从第一位开始这么做,最终只要比较当前位即可。若乘了10次仍不同,说明不循环,答案就是-1。
时间复杂度O(10n^3),轻松通过本题
#include<bits/stdc++.h> using namespace std; struct node{int a[105];}a,now,base,tmp,ans; int n,xh[10]={1,1,4,4,2,1,1,4,4,2}; char str[105]; node operator*(node a,node b) { node c; for(int i=0;i<n;i++)c.a[i]=0; for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(i+j<n) { c.a[i+j]+=a.a[i]*b.a[j]; c.a[i+j+1]+=c.a[i+j]/10; c.a[i+j]%=10; } c.a[n]=0;return c; } node operator*(node a,int b) { for(int i=0;i<n;i++)a.a[i]*=b; for(int i=0;i<n;i++)a.a[i+1]+=a.a[i]/10,a.a[i]%=10; return a; } int main() { scanf("%s%d",str,&n); int len=strlen(str); for(int i=len-1;i>=max(0,len-n);i--)a.a[len-i-1]=str[i]-'0'; ans.a[0]=xh[a.a[0]]; base.a[0]=1,tmp=a; for(int i=1;i<=xh[a.a[0]];i++)base=base*tmp; for(int i=1;i<n;i++) { tmp=base,now=a; for(int j=1;j<=11;j++) { if(j==11){puts("-1");return 0;} now=now*tmp; if(a.a[i]==now.a[i]){ans=ans*j;break;} base=base*tmp; } } int flag=0; for(int i=102;i>=0;i--) { if(ans.a[i])flag=1; if(flag)printf("%d",ans.a[i]); } }