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


 

 

posted @ 2013-04-09 21:01  xinyuyuanm  阅读(169)  评论(0编辑  收藏  举报