列の数を定義します。
$ \が\ {\開始{eqnarray *} F_1&=&A \\ F_2&=&B \\ F_nを左&=&C \ CDOT {} F_ {N-2} + D \ CDOT {} F_ {N-右。$ \ 1} + \左\ lfloor \ FRAC {P} {N} \右\ rfloor \端{eqnarray *}
n番目のカラムの数の要件。
明らかに分割ブロッキング問題、$ \は、高速電力にマトリックスに\ lfloor \ FRAC {P} {N} \右\ rfloor $のnは同じ基を残しました。複雑$ O(nlognのsqrt \ ^ 3 3)$
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 typedefの長い 長いLL。 4 のconst int型 N = 1E5 + 10、MOD = 1E9 + 7 。 5 int型N、A、B、C、D、P。 6 構造体マット{ 7 INT [ 3 ] [ 3 ]、N。 8 マット(){memsetの(0、はsizeof a)に示すように、n = 3 ;} 9 INT * 演算子 [](INT X){ リターン[X];} 10 マット演算子 + (マットB){ 11 マットC。 12 のために(int型 I = 0 ; iがN <++ I) 13 のための(INT J = 0 ; J <N; ++ j)の 14 C [i]は[J] =([I] [J] + B [i]は[J])%のMOD。 15 リターンC。 16 } 17 マット演算子 * (マットB){ 18 マットC。 19 のために(int型 I = 0 ; iがN <; ++ i)は 20 のために(INT J = 0 ; J <N; ++ j)は 21 のために(INT K = 0、N <K; ++ k)を 22個の C [i]は[J] =(C [i]は[J] + (LL)[I] [K] * B [k]は[J])%MOD。 23 リターンC; 24 } 25 }。 26マットパウ(マットのx、int型P){ 27 マットRET。 28 のためには、(int型 i = 0 ; I <ret.n; ++ I)RETを[I] [I] = 1 。 29 のために(; P; P >> = 1、X = X * X)であれば(P 1)RET = RET * X。 30 リターンRET; 31 } 32 、INT (){解く 33 場合(Nの== 1)を返します。 34 マットT。 35 のために(int型 I = 0 ; iがテネシー州<; ++ I)T [i]は[I] = 1 。 36 のための(int型、L = 3、R、K、L <= N; L = R + 1 ){ 37 、K = P / L、R = K && P / K <N P /?K:N。 38 マットX。 39 X [ 0 ] [ 0] = D。 40 X [ 0 ] [ 1 ] = C。 41 X [ 0 ] [ 2 ] = K。 42 X [ 1 ] [ 0 ] = 1 。 43 X [ 2 ] [ 2 ] = 1 。 44 X =パウ(X、R-L + 1 )。 45 、T = X * T。 46 } 47 リターン((LL)T [ 0 ] [ 0 ] * Bの%のMOD +(LL)T [ 0 ] [ 1] *%MOD +のT [ 0 ] [ 2 ])%MOD。 48 } 49 INT メイン(){ 50 のint T。 51 のために(scanf関数(" %のD "、&T); T-- ;){ 52 のscanf(" %D%D%D%D%D%D "、&A、&B、&C、&D、&P&N) ; 53 のprintf(" %d個の\ n " 、解決())。 54 } 55 リターン 0 。 56 }