算法分析与设计课堂实验(5 分支策略3
问题描述】
在Fibonacci数列中,
。例如,Fibonacci数列的前十项是:
0,1,1,2,3,5,8,13,21,34,…
Fibonacci序列的另一个公式是
给定一个整数
,请你计算
在10进制表示下的最后四位。
【输入形式】
输入将包含一个测试用例。每个测试用例仅有一行,包含一个整数
(其中
)。
【输出形式】
对于每个测试用例,输出
的最后四位数字。如果
的最后四位都是零,则输出
;否则,省略任何前导零(即,输出
)。
【样例输入】
0
【样例输出】
0
样例输入】
9
【样例输出】
34
#include <iostream>
#include <string>
using namespace std;
const int MOD = 10000;
pair<int, int> fast_doubling(int n) {
if (n == 0) {
return {0, 1};
}
auto [a, b] = fast_doubling(n >> 1);
int c = (a * (( (2 * b - a) % MOD + MOD ) % MOD )) % MOD;
int d = ( (a * a % MOD) + (b * b % MOD) ) % MOD;
if (n & 1) {
return {d % MOD, (c + d) % MOD};
} else {
return {c % MOD, d % MOD};
}
}
int main() {
int n;
cin >> n;
if (n == 0) {
cout << 0 << endl;
return 0;
}
auto [fib_n, fib_n1] = fast_doubling(n);
int res = fib_n;
char buffer[5];
sprintf(buffer, "%04d", res);
string s(buffer);
size_t start = s.find_first_not_of('0');
if (start == string::npos) {
cout << 0 << endl;
} else {
cout << s.substr(start) << endl;
}
return 0;
}