“藍橋杯”演算法大賽·入門演算法(1)
阿新 • • 發佈:2018-12-20
問題描述
斐波那契(Fibonacci)數列的遞推公式為:,其中。當比較大時,也非常大。現在我們想知道,除以10007的餘數是多少?
參考演算法
C++
#include <iostream> constexpr auto MOD = 10007; using namespace std; int main() { int n; cin >> n; int fibonacci[n]; fibonacci[0] = fibonacci[1] = 1; for (auto i = 2; i < n; i++) fibonacci[i] = (fibonacci[i - 2] + fibonacci[i - 1]) % MOD; cout << fibonacci[n - 1]; return 0; }
Java
import java.util.Scanner; public class Main{ final static int MOD = 10007; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] fibonacci = new int[n]; fibonacci[0] = fibonacci[1] = 1; for (int i = 2; i < n; i++) fibonacci[i] = (fibonacci[i - 2] + fibonacci[i - 1]) % MOD; System.out.println(fibonacci[n - 1]); scanner.close(); } }
計算思想
這道題目可以類比n進位制(此處是10007進位制)大整數相加求最後一位數的值。結果的最後一位數就是2個大整數最後一位數對應相加取餘。這樣我們就沒有必要準確計算每一項的值,再由準確值求餘。