首页 > 代码库 > hdu 1005

hdu 1005

这题根据公式可以得出规律 

当出现 1 1时 表示达到循环节点

因此可以打表求余得出结果

但是至于为什么49 是最大周期

 

找到了点资料是说

每个数是有前两个数来决定

而数的结果只有0 到6 七种可能

因此是 7*7=49

 

只能意会了 而且还出现了奇怪的bug 把for循环换成while就一直wa 

如果只有49次不是应该break的吗 为什么会re

 

#include<stdio.h>#include<string.h>#include<math.h>#include<iostream>#include<algorithm>#include<queue>#include<stack>#define mem(a,b) memset(a,b,sizeof(a))using namespace std;int arr[10000];int main(){     arr[1]=arr[2]=1;            int a,b,n;         while(cin>>a>>b>>n,a||b||n)    {         int i;        for(i=3;i<10000;i++)        {            arr[i]=(a*arr[i-1]+b*arr[i-2])%7;            if(arr[i]==1&&arr[i-1]==1) break;        }             		        n=n%(i-2);        arr[0]=arr[i-2];        cout << arr[n] << endl;       }    return 0;}

  

 

以下是re代码

#include<stdio.h>#include<string.h>#include<math.h>#include<iostream>#include<algorithm>#include<queue>#include<stack>#define mem(a,b) memset(a,b,sizeof(a))#define ll __int64#define MAXN 1000#define INF 0x7ffffff#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;int num[10000];int main(){     num[1]=1;     num[2]=1;     int i,j;     int a,b,que;     int flag;    while(scanf("%d%d%d",&a,&b,&que)!=EOF)    {        if(a==0&&b==0&&que==0) break;        i=3;        while(1)        {            num[i]=(a*num[i-1]+b*num[i-2])%7;            if(num[i]==1&&num[i-1]==1) break;            i++;        }        flag=i-2;        if(que%flag)        printf("%d\n",num[que%flag]);        else            printf("%d\n",num[flag]);    }    return 0;}