题解:

迭代,一次次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]);   
}  

 

posted on 2017-09-27 19:48  宣毅鸣  阅读(170)  评论(0编辑  收藏  举报