Number Sequence
f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
Given A, B, and n, you are to calculate the value of f(n).
1 1 3 1 2 10 0 0 0
2 5
此题是一个周期性循环的题目,很有技巧性
以下为分析:
既然A,B的值是一定的,而且前两个是1,1。那么后面的数就是固定的了,两两得一,必定还会出现1,1这种搭配,而当第一个1,1搭配出现的时候,也就是第一个最小周期出现的时候,也就是说,周期也就确定了。所以说后面的N不管有多大,只要除以周期,就转化成第一个最小周期中的某个数了。但是多大的范围下必定会再出现1,1搭配呢?首先,出现f(n)=1的概率为1/7,下一个仍然是f(n)=1的概率是1/7,所以1,1搭配出现的概率就是1/49。所以按照概率来讲,每49个数是必定会出现1,1搭配的。那么就从f(1)求到f(49)就够用了。也就是从这49个数中查找到真正的最小周期,代码如下:
#include<stdio.h>
int s[60];
int main()
{
int A,B,n;
while(scanf("%d%d%d",&A,&B,&n)!=EOF&&A&&B&&n)
{
int i,t;
s[1]=1;
s[2]=1;
for(i=3;i<50;i++)//49之内必出规律
{
s[i]=(A*s[i-1]+B*s[i-2])%7;
if(s[i]==1&&s[i-1]==1)
break;
}
t=i-2;//得出最小周期数
n=n%t;//得出最小周期数中与N结果等同的数
if(n==0)
n=t;
printf("%d\n",s[n]);
}
return 0;
}