hdu1005

来源:互联网 发布:入门级手表 知乎 编辑:程序博客网 时间:2024/04/27 20:11
#include<iostream>using namespace std;int main(){int a,b,c;while((cin>>a>>b>>c)&&(a+b+c)>0){int num[55];num[0]=num[1]=1;int sign;for(int i=2;i<50;i++){num[i]=(a*num[i-1]+b*num[i-2])%7;if(num[i]==1&&num[i-1]==1){sign=i-2;break;}}cout<<num[(c-1)%(sign+1)]<<endl;}return 0;}

n=100,000,000,用递归的话会栈溢出,即数组不能开到那么大。


找出循环节,通过分析,f(n)的取值有0,1,2,3,4,5,6共7种可能(对其%7)。设初始状态为1,1,x。则下一状态为1,x,y。再循环一次为x,y,z。。。。。。直到又一次到达1,1,x的状态,又因为f(n)=(a*f(n-1)+b*f(n-2))共有49种不同的组合方式,所以将x,y,z看成是一组数据,则第三个数z最多有49种,即最多经过49次即可找到循环节。

0 0
原创粉丝点击