See the article on https://dyingdown.github.io/2019/12/19/HDU-1005%20Number-Sequence/
Number Sequence
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
Analysis
This problem seems like a very huge problem, however, the answers have some certain regular pattern. For f [ n ] f[n] f[n], it’s consisted of a basic number array. That means after a certain number of numbers, the numbers will be the same as begin. Like 1 , 2 , 5 , 6 , 1 , 2 , 5 , 6 , 1 , 2 , 5 , 6 ⋯ 1, 2, 5, 6, 1, 2, 5, 6, 1, 2, 5, 6 \cdots 1,2,5,6,1,2,5,6,1,2,5,6⋯. So just loop to find the recycle number.
Code
Not that if you don’t define boarder for i, it will be time limit exceeded. And the biggest recycled number is no bigger than 49.
#include<bits/stdc++.h>
using namespace std;
int f[100];
int main() {
int a, b, n;
while(cin >> a >> b >> n, a, b, n) {
f[1] = f[2] = 1;
int i = 3;
for(; i < 50; i ++) {
f[i] = (a * f[i - 1] + b * f[i - 2]) % 7;
if(f[i - 1] == 1 and f[i] == 1) {
break;
}
}
f[0] = f[i - 2];
cout << f[n % (i - 2)] << endl;
}
return 0;
}
本文探讨了一种特定数列的周期性规律,通过分析数列f(n)=(A*f(n-1)+B*f(n-2))mod7的特性,发现其在一定长度后会重复出现相同的数值序列。文章提供了一种高效算法,用于快速计算数列中任意项的值,避免了直接递归或迭代计算导致的时间复杂度过高的问题。
1184

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



