HDOJ1005(找循环节点)
首先,对于网上那些直接说循环点是48的,表示质疑。
因为
(x+y)%7=(x%7+y%7)%7
所以
f[n-1]和f(n-2)的取值范围都是{0,1,2,3,4,5,6}
所以一共49种,由于从0开始,所以是小于等于48,
还要考虑特殊情况,因为对f[n]有影响的还有A和B
当A和B都是7的倍数的时候,则序列为1 1 0 0 0 0 0.....
否则,序列则会按照某个循环节点t不断循环延伸下去
t不一定是48;所以,应该测试。
另附上:
/*HDOJ1005 作者:陈佳润 2013-04-09 */ #include<iostream> using namespace std; int main(){ int f[100],a,b,i; long n; f[0]=1;f[1]=1; while(scanf("%d%d%ld",&a,&b,&n)!=EOF&&(a!=0||b!=0||n!=0)){ if(a%7==0&&b%7==0) cout<<(n>1?0:1)<<endl; else{ for(i=2;i<=48;i++) f[i]=(a*f[i-1]+b*f[i-2])%7; for(i=1;i<=48;i++) if(f[i]==f[0]&&f[i+1]==f[1]) break; cout<<f[(n-1)%i]<<endl; } } return 0; }