【题目】http://acm.hdu.edu.cn/showproblem.php?pid=1005
【报告】
这道明显是数学题,但如果按位枚举显然是要TLE的。
仔细思考,它有一个MOD 7,这个很容易出现循环。所以,我们只要找出循环节,就可以很轻松的解决了。
具体怎么找,可以开一个a[7][7]的数组,用a[i][j]表示f[n-2]=i,f[n-1]=j的计算是否已经计算过,如果没计算过,则填入当前的n,如果计算过了,那么记下这个值,然后直接break。然后用数学方法直接计算出答案。
【程序】
// TASK: 1005 Number Sequence#include <cstdlib>
#include <iostream>
#include <cstdio>
using namespace std;
long a,b,n,p;
long f[3001],m;
long ha[7][7];
int main(int argc, char *argv[])
{
while (cin >> a >> b >> n)
{
if (a==0&&b==0&&n==0) break;
memset(f,0,sizeof(f));
f[1]=f[2]=1;m=2;
memset(ha,0,sizeof(ha));
ha[1][1]=2;
for (long i=3;i<=n;i++)
{
f[++m]=(a*f[i-1]+b*f[i-2])%7;
if (ha[f[m-1]][f[m]]<=0)
ha[f[m-1]][f[m]]=m;
else
{
p=ha[f[m-1]][f[m]];
break;
}
}
if (m>=n) cout << f[n] << endl;
else cout << f[(n-p)%(m-p)+p] << endl;
}
//system("PAUSE");
return EXIT_SUCCESS;
}