1. 程式人生 > >“藍橋杯”演算法大賽·入門演算法(1)

“藍橋杯”演算法大賽·入門演算法(1)

問題描述

斐波那契(Fibonacci)數列的遞推公式為:F_n=F_{n-1}+F_{n-2},其中F_1=F_2=1。當n比較大時,F_n也非常大。現在我們想知道,F_n除以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個大整數最後一位數對應相加取餘。這樣我們就沒有必要準確計算每一項的值,再由準確值求餘。