题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005
Problem Description
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).
Input
The input consists of multiple test cases. Each test case contains 3 integers A, B and n on a single line (1 <= A, B <= 1000, 1 <= n <= 100,000,000). Three zeros signal the end of input and this test case is not to be processed.
Output
For each test case, print the value of f(n) on a single line.
Sample Input
1 1 3
1 2 10
0 0 0
Sample Output
2
5
由于%7和极大的数据,理应第一时间想到找规律的
详细方法看:https://blog.csdn.net/hnust_xiehonghao/article/details/7933362
代码如下:
#include<cstdio>
using namespace std;
const int maxn = 1e8 + 5;
int f[maxn], a, b, n;
int main(void) {
f[1] = f[2] = 1;
while (~scanf("%d %d %d", &a, &b, &n) && (a || b || n)) {
int st = 0, mod = 0;
for (int i = 3; i <= n; i++) {
f[i] = (a * f[i - 1] + b * f[i - 2]) % 7;
for (int j = 2; j < i; j++) {
if (f[j - 1] == f[i - 1] && f[j] == f[i]) {
mod = i - j;
st = j;
}
}
if (mod)break;
}
if (mod) {
//因为范围是0 - mod-1 所以要有(n-1)%mod+1,由于起点为j-1,则也要有(n-(j-1))%mod+j-1
printf("%d\n", f[(n - st) % mod + st]);
}
else {
printf("%d\n", f[n]);
}
}
return 0;
}