Description
已知f(1)=1,f(2)=1以及递推公式f(n)=(A*f(n-1)+B*f(n-2))(mod 7),先给出A,B和n,求出f(n)
Input
多组输入,每组用例占一行包括三个整数A,B和n,以0 0 0结束输入
Output
对于每组用例,输出f(n)
Sample Input
1 1 3
1 2 10
0 0 0
Sample Output
2
5
Solution
因为f(n)=(A*f(n-1)+B*f(n-2))(mod 7),f(n-1)和f(n-2)都分别只有0~6七种情况,而f(n)只有f(n-1)和f(n-2)得来,所以f(n)取值的循环节最长为49,所以暴力枚举找出循环节即可
Code
#include<cstdio>
#include<iostream>
using namespace std;
#define maxn 11111
int a,b,n,f[maxn];
int main()
{
f[1]=f[2]=1;
while(scanf("%d%d%d",&a,&b,&n),a||b||n)
{
if(n<3)
{
printf("1\n");
continue;
}
int len;
for(int i=3;i<=10000;i++)
{
f[i]=(a*f[i-1]+b*f[i-2])%7;
if(f[i-1]==1&&f[i]==1)
{
len=i-2;
break;
}
}
n=n%len;
if(n==0)n=len;
printf("%d\n",f[n]);
}
return 0;
}