noip2005循环

题解:

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

 

转载于:https://www.cnblogs.com/xuanyiming/p/7603517.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值