質問の意味:
最初の入力X0、X1、A、BおよびXIに従う= *のX(I-1)+ B * X(I-2)(I> = 2)
あなたは剰余MODにX(n)の値に基づいて式を見つけるようにした後、モッズ、nは再入力
ソリューション:
私たちはすぐにすぐに電源の係数行列を見つけることができると考えています
| X0 X1 | * | 0 | = | X1 X2 |
| 1件のB |
なお、上記式に従って高速電力行列を作成することです
しかし、我々はまだ問題があるパワーの係数行列を見つけるためにあまりにも長い間、長い長いの範囲を超えてきたビットのnトピックの入力の数に注意を払う必要があります
我々は、観察されたもの1,2 * 10,1×100である2 ^ 121のパワー、
2 ^ 121 =(2 ^ 1)*(10 ^ 2)*(2 ^ 2)*(10 ^ 2)*(^ 1 2)
この特徴によれば、我々は解凍するために数回の大きな力を入れることができます^ _ ^
コード:
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 typedefの長い 長いLL。 4 のconst int型のサイズ= 1E6 + 5 。 5 チャーN [サイズ]。 6 int型X0、X1、B; 7 typedefの長い 長いLL。 8 LLモッズ。 9 構造体マット 10 { 11 のint M [ 3 ] [ 3 ]。 12 マット(){ 用(INT I = 0;私は< 3 I ++); のため(INT J = 0 ; J < 3 ; J ++)M [I] [J] = 0 ;} 13 友人マット演算子 * (マットX、マットY) 14 { 15の マットANSを、 16 のためには、(int型 i = 1 ; iが<= 2 ; I ++ ) 17 { 18 のための(int型 J = 1 ; J <= 2、J ++ ) 19 { 20 のために(INTK = 1 ; K <= 2 ; ++ kは) 21 { 22 ans.mを[I] [K] =(ans.m [I] [K] + 1LL * XM [I] [J] * YM [J] [ K])%の変化。 23 } 24 } 25 } 26 リターン年。 27 } 28 }。 29インラインquick_powマット(マットは、あるint型B) 30 { 31 マット年。 32 ans.m [ 1 ] [ 1 ] = 1 ; ans.m [ 2 ] [ 2 ] =1 ; 33 一方、(B) 34 { 35 であれば(B&1)ANS = ANS * 。 36 = *のA。 37 B >> = 1 。 38 } 39の リターンANS。 40 } 41 のint main()の 42 { 43 のscanf(" %D%D%D%D "、及びX0、X1および、&、&B)。 44 のscanf(" %sの%のLLD "、N、&MOD)。 45 マットORI。 46 INT LEN = STRLEN(N)。 47 ori.m [ 1 ] [ 2 ] = 1を ori.m、[ 2 ] [ 1 ] Bが=; ori.mは、[ 2 ] [ 2 ] = 。 48の マットANS; 49 ans.m [ 1 ] [ 1 ] = 1 ; ans.m [ 2 ] [ 2 ] = 1 ; 50 のために(int型 I = len- 1 ; I> = 0 ; i-- ) 51 { 52 -のANS =のANS * quick_pow(ORI、N [i]が'0 " ); 53 ORI = quick_pow(ORI、10 )。 54 } 55 のprintf(" %LLDする\ n "、(1LL * X0 * ans.m [ 1 ] [ 1 ] + 1LL * X1 * ans.m [ 1 ] [ 2 ])%のMOD)を、 56 }