分析:由于n是1e8直接暴力是不可能了,观察到取模数是7,所以f[i]取模无非在0~7之间,而A和B是不变的,f[i]由f[i - 1]和f[i - 2]转移过来,最多也就有49种可能,大于它的时候找到循环节输出即可
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#include<string>
#include<vector>
using namespace std;
const int N = 1010;
int f[60],res[60];
int main()
{
int a,b,n;
while(scanf("%d%d%d",&a,&b,&n) && a && b && n)
{
memset(f,0,sizeof(f));
memset(res,0,sizeof(res));
f[1] = f[2] = 1;
int flag = 0;
int st,ed;
for(int i = 3; i <= n; i++)
{
f[i] = (a * f[i - 1] + b * f[i - 2]) % 7;
// printf("%d\n",f[i]);
for(int j = 2; j <= i - 1; j++)
{
if(f[j] == f[i] && f[j - 1] == f[i - 1])
{
st = j - 1;
ed = i - 1;
flag = 1;
break;
}
}
if(flag)break;
}
if(flag)
printf("%d\n",f[(n - ed) % (ed - st) + st]);
else
printf("%d\n",f[n]);
}
return 0;
}