アイテムnはフィボナッチLOJ位10220.「2スルー6.5例」

タイトル説明

我々は、すべてのフィボナッチ数列それ、F1 = 1、F2 = 1、F3 = 2、F4 = 3、...、FN = FN-1 + FN-2ということを知っています

今の問題は単純であり、入力N M、FNのmod Mを求めています。

入力形式

入力N、M。

出力フォーマット

モッズメートルFN出力。

サンプルデータ

サンプル入力

5 1000

サンプル出力

5

制限事項とヒント

データの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を返します。
}

 

おすすめ

転載: www.cnblogs.com/mysh/p/11330310.html