タイトル説明
我々は、すべてのフィボナッチ数列それ、F1 = 1、F2 = 1、F3 = 2、F4 = 3、...、FN = FN-1 + FN-2ということを知っています
今の問題は単純であり、入力N M、FNのmod Mを求めています。
入力形式
入力N、M。
出力フォーマット
モッズメートルFN出力。
サンプルデータ
サンプル入力
サンプル出力
制限事項とヒント
データの100%、1≤n≤2×10 ^9,1≤m≤10^ 9 + 10
考え
テンプレートのタイトル、迅速な行列乗算パワー+
コード:
#include <cmath> の#include <cstdioを> する#include <CStringの> する#include <iostreamの> する#include <アルゴリズム> 名前空間STDを使用して、 長い長いnは、モッズ。 長い長い[3] [3]、B [3] [3]。 長い長いANS [3] [3]、C [3] [3]。 ボイド追加(長いロング・X、長い長いY){ X = X + Y。 X - =(X> = MOD)モッド:0;? 返します。 } )(メインINT { [1] [1] [1] [2] [2] [1] = 1 ==。 [2] [2] = 0。 [1] [1] =のANS [2] [2] = 1 ANS。 [1] [2] =のANS [2] [1] = 0 ANS。 scanf関数( "%のLLDの%のLLD"、&N、&MOD)。 N - ; 一方、(N){ IF(N - 1){ memsetの(C、0、はsizeof(c)参照)。 ための式(I = 1 int型、iは<= 2; I ++) のための(INT J = 1; J <= 2。 のための(INT K = 1; K <= 2。 を追加([I] [J] CをANS [I] [K] * [k]は[J]%MOD)。 MEMMOVE(ANS、C、はsizeof(ANS))。 } のmemset(C、0、はsizeof(c)参照)。 ための式(I ++; I = 2 <I = 1 INT) のための(INT J = 1; J <= 2であり、j ++) のための(INT K = 1; K <= 2; ++ K) (追加Cを[I] [Jを]、[I] [K] * [k]は[J]%MOD)。 MEMMOVE(C、はsizeof(a)参照)。 N >> = 1。 } B [1] [1] = 1。 B [1] [2] = 0。 memset(C、0、はsizeof(c)参照)。 ための式(I ++; I = 2 <I = 1 INT) のための(INT J = 1; J <= 2であり、j ++) のための(INT K = 1; K <= 2; ++ K) (追加Cを[I] [Jを]、ANS [I] [K] * B [k]は[J])。 MEMMOVE(B、C、はsizeof(b)参照)。 printf( "%LLDする\ n"、B [1] [1])。 0を返します。 }