http://acm.hdu.edu.cn/showproblem.php?pid=1005
A number sequence is defined as follows:
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).
直接递归求解f(n)的话,会MLE
在计算f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7 时,最后的结果会是0~6之中的数,因为A和B是不变的,f(n-1)的取值范围为[0,6],同样f(n-2)的取值范围也是[0,6],两个数的组合一共有7*7=49种组合,第50个就会和第1个是一样的了,所以只要记录前49个数就行了。
#include <iostream>
#include <cstdio>
using namespace std;
int m[52];
int main()
{
int n,a,b;
while(scanf("%d%d%d",&a,&b,&n)!=EOF)
{
if(a==0 && b==0 && n==0)
return 0;
m[1] = 1;
m[2] = 1;
for(int i=3;i<=49;i++)
{
m[i] = (a*m[i-1]+b*m[i-2])%7;
}
printf("%d\n",m[n%49]);
}
return 0;
}