规律题,对于f(n -1)由于对7取模,故只有0,1,2,...,6七种选择,同理f(n - 2)也是七种,由于a和b又是常数,故一共有7*7=49种组合,也就是说在50个之内定会出现循环节点,找到循环节点即可
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int main()
{
int r[55];
int i, j, a, b, n, beg, en, flag;
while (~scanf("%d%d%d", &a, &b, &n) && (a || b || n)) {
r[0] = r[1] = r[2] = 1;
flag = 0;
for (i = 3; i <= n; i++) {
r[i] = (a * r[i - 1] + b * r[i - 2]) % 7;
for (j = 2; j <= i - 1; j++) { ///在i之前的遍历r,看是否有循环节,有则结束计算,flag = 1
if (r[i] == r[j] && r[i - 1] == r[j - 1]) {
flag = 1;
beg = j;
en = i;
break;
}
}
if (flag) break;
}
if (flag) { ///给的n已经超过了循环区间的大小
printf("%d\n", r[beg + (n - en) % (en - beg)]);
} else {
printf("%d\n", r[n]); ///给的n还没有出现循环,直接输出r[n]即可
}
}
return 0;
}
3713

被折叠的 条评论
为什么被折叠?



