http://acm.hdu.edu.cn/showproblem.php?pid=1005
题意是给定
A
A
、、
n
n
,数列满足
f(1)=1,f(2)=1,f(n)=(A∗f(n−1)+B∗f(n−2)) mod 7
f
(
1
)
=
1
,
f
(
2
)
=
1
,
f
(
n
)
=
(
A
∗
f
(
n
−
1
)
+
B
∗
f
(
n
−
2
)
)
m
o
d
7
n
n
最大到暴力模拟肯定T了,所以找规律,因为是mod7,所以
f[n−1]
f
[
n
−
1
]
和
f[n−2]
f
[
n
−
2
]
肯定属于
[0,6]
[
0
,
6
]
,分别有7种可能,组合一下就是49种,所以第49个数与第1个数相等,即
f[i]==f[i+48]
f
[
i
]
==
f
[
i
+
48
]
,也就是每48个数一次循环,即
f[i]==f[i%48]
f
[
i
]
==
f
[
i
%
48
]
。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
int n,A,B,f[1010];
int main()
{
while(scanf("%d%d%d",&A,&B,&n)&&(A||B||n))
{
f[1]=1;f[2]=1;
for(int i=3;i<=48;i++)
f[i]=(A*f[i-1]+B*f[i-2])%7;
printf("%d\n",f[n%48]);
}
}