Fibonacci 數列:F₁ = F₂ = 1,Fₙ = Fₙ₋₁ + Fₙ₋₂ (n ≥ 3)。求 Fₙ mod 10007。n ≤ 1,000,000。
// ❌ 指數級遞歸,n=50 就極慢
int Fibonacci(int n) {
if (n == 1 || n == 2) return 1;
return Fibonacci(n-1) + Fibonacci(n-2);
}
關鍵性質:(a + b) % m = (a % m + b % m) % m。直接計算餘數,避免大數溢出。
#include <iostream>
using namespace std;
const int MOD = 10007;
const int MAXN = 1000003;
int f[MAXN];
void precompute() {
f[1] = f[2] = 1;
for (int i = 3; i < MAXN; i++) {
f[i] = (f[i-1] + f[i-2]) % MOD;
}
}
int main() {
precompute();
int n;
while (cin >> n) {
cout << f[n] << endl;
}
return 0;
}
只需保留前兩項:
int fib_mod(int n) {
if (n <= 2) return 1;
int a = 1, b = 1, c;
for (int i = 3; i <= n; i++) {
c = (a + b) % MOD;
a = b;
b = c;
}
return b;
}
對於極大 n(如 10¹⁸),可用矩陣快速冪:
[Fₙ ] [1 1]ⁿ⁻¹ [F₁] [Fₙ₋₁] = [1 0] [F₀]