入門訓練Fibonacci数列java実現心得


問題記述Fibonacci数列の繰返し式は、Fn=Fn-1+Fn-2であり、F 1=F 2=1である.
nが比較的大きい場合,Fnも非常に大きく,Fnを10007で割った残数がどれだけあるかを知りたい.
入力フォーマット入力には整数nが含まれます.出力フォーマットは、Fnが10007で除算された残数を表す整数を含む行を出力します.説明:本題では、答えはFnを10007の余数で割ることを要求するので、私たちはこの余数を算出することができればいいだけで、先にFnの正確な値を計算する必要はなく、計算の結果を10007で除算して余数を取り、直接余数を計算するのは先に原数を算出してから余剰を取るより簡単であることが多い.
サンプル入力10サンプル出力55サンプル入力22サンプル出力7704データ規模と約1<=n<=1000000.
錦嚢1は配列を用いてFシーケンスを保存し,10007を除いた余りのみを保存する.錦嚢2は、F[1]=1、F[2]=1を先に命令し、F[i]=(F[i-1]+F[i-2])%10007を用いてF[i]を計算する.>
自分の理解:
錦嚢のヒントによると、私たちは配列を使ってこの問題を解く必要があることが明らかになった.同時に、問題の明らかなヒントは最終結果を計算してから残数を取る必要はない.今回はnの範囲が非常に大きいので、私たちが定義したintの範囲を超えなければならない.加算の中で、最後に余剰を取るのは余剰を取る計算結果と同じなので、F[i]=(F[i-1]+F[i-2])%10007で計算します.
int(整型範囲)32-21747483648-21748483648
import java.util.Scanner;

public class Fibon1 {
    public static void main(String args[]) {
        Scanner scanner=new Scanner(System.in);
        int num=scanner.nextInt();
        int[] a=new int[num+2];
        a[1]=1;
        a[2]=1;
        for(int i=3;i<=num;i++) {
            a[i]=(a[i-1]+a[i-2])%10007;
        }
        System.out.println(a[num]);
    }

}

**評価結果適正スコア100 CPU使用265 msメモリ使用25.01 MB**