题目链接:https://vjudge.net/problem/HDU-1005
题意:输入a,b,n,求f(n)。f的递推式:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
思路:首先循环的开始不一定是1 1,当a=5555,b=666666,f是1142142142142。因此以11开始找循环的起点终点是不对的。因为对7取余,而这一项的f由上一项和上上一项决定,因此应该总共有7*7=49种,也就是循环长度是49。和紫书p316 uva11582类似,但是因为取模的数太大,不能按照这个题的思路找规律,应该是直接找循环的开始。
#include <bits/stdc++.h>
using namespace std;
const int maxn=55;
int f[maxn];
int main()
{
int a,b,c;
while(scanf("%d%d%d",&a,&b,&c))
{
if(a==b&&a==c&&a==0)
break;
f[1]=f[2]=1;
int pos=-1;
for(int i=3; i<maxn; i++)
{
f[i]=(a*f[i-1]+b*f[i-2])%7;
}
if(c<maxn)
printf("%d\n",f[c]);
else
{
c%=49;
if(!c)
c=49;
printf("%d\n",f[c]);
}
}
return 0;
}