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;
}

浙公网安备 33010602011771号