Number Sequence
思路:
如果暴力模拟,必定超时,因为 1 <= n <= 100,000,000
找规律,并未发现什么可循的规律
进一步观察题目发现:
f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7
-> f(n)的取值范围为 0~6
-> f(n - 1),f(n - 2) 数对的组合只有 49 种
-> 当 n 很大时,一定会有循环计算
用一个 7*7 的数组记录,f(n - 1),f(n - 2) 数对 的出现次序,用以计算循环长度和判断循环起始位置。
C 代码如下:
#include <stdio.h>
#include <string.h>
int A, B, n, a, b, c, i;
int mp[7][7];
int main() {
while (1) {
scanf("%d %d %d", &A, &B, &n);
if (A == 0 && B == 0 && n == 0) break;
if (n <= 2) {
printf("1\n");
}
else {
memset(mp, 0, sizeof(mp));
a = 1;
b = 1;
mp[1][1] = 2;
for (i = 3; i <= n; i++) {
c = (A*b + B*a) % 7;
a = b;
b = c;
if (mp[a][b]) break;
mp[a][b] = i;
}
if (i < n) {
n -= i;
n %= i - mp[a][b];
for (i = 0; i < n; i++) {
c = (A*b + B*a) % 7;
a = b;
b = c;
}
}
printf("%d\n", c);
}
}
return 0;
}