ファーマージョンは最近、彼の家の周りにそれらを植えるために3つの花を購入しています。花は、赤、緑、青の3色でした。
我々はすべて知っているように、農家のジョンの家を取り囲んでいる庭は魔法の庭です。それはあなたには、いくつかの日に、その中に花の数を植える場合は、花の数が、次の日に増加することを意味します。
庭は花の色に応じて花の数が増加し、それはあなたが一日に赤い花を植えた場合、それがに変わります、である (次の日に6つの花、1つの赤い花を 2つの緑の花、および 3青い花)。あなたが一日で緑の花を植える場合は、それがに変わります 翌日に15flowers(4つの赤い花、 5つの緑の花、そして 6個の青い花)。あなたが一日に青い花を植える場合は、それがに変わります 翌日中24flowers(7つの赤い花、 8つの緑の花、そして 9個の青花)。
我々は上記述べたように、農家ジョンは3つの花(持っている1つの赤い花、 1つの緑の花、そして 1つの青色の花を)、と彼は彼の家の周りに彼の魔法の庭に植えるますので、花の数は、時間の経過とともに増加します。ファーマージョンは彼が彼の魔法の庭に彼の3つの花を植えた場合、その後、花の数は日々増加していることを知っているので、彼は彼の魔法の庭で花の総数を知りたい のn 番目の 日。
入力の最初の行は、テストケースの数であり、 T (1≤ T ≤10 3)。各テストケースは、単一の整数を含む単一の行から成る N(1≤ nは 10≤ 9)。
各テストケースのために、中に魔法の庭園で花の総数を含む単一の行印刷 のn 番目の 日モジュロ 十億七を。
4
1
2
20
1000000
3
45
238775645
464884429
質問の意味:花1日赤い花、2つの緑の花、3つの青い花を作り出します。
グリーンベニバナ4、5つの緑色の花、青花6を生成するために一日を過ごします。
青ベニバナ7,8緑色の花、青花9を生成日を過ごします。
ベニバナを始めて、緑の花、青い花一つ一つ、そしてその日のnの合計を過ごすためにどのくらい尋ね、モジュロ十億七の結果
ソリューション:再帰は................それが行列高速電力だと思うようになりました
書式#include <iostreamの> 書式#include < 文字列の.h> の#include <stdio.hに> に#define LL長い長い 使って 名前空間はstdを、 constの LL MOD = 1000000007 ; 構造体マット// 定义矩阵结构体 { LLのM [ 3 ] [ 3 ]。 マット() { memsetの(M、0、はsizeof (M))。 } }。 マットMUL(マット&A、マット&B) { マットC。 以下のために(int型 = Iを0 ;私は<3 ; 私は++ ) { ための(int型 J = 0 ; J < 3 ; J ++ ) { ための(int型のk = 0 ; K < 3 ; kは++ ) { Cmを[I] [J] =(CM [I] [J] +アム[ I] [K] * Bmの[K] [J])%MOD。 } } } 戻りC。 } マットPOW(マットA、LL N) { マットB。 以下のために(int型 i = 0 ; iは< 3 ; iは++)// 初始化方阵 Bmの[i]は[I] =0 ; // 初期行列を初期値と乗算される Bmの[ 0 ] [ 0 ] = 1 ; Bmを[ 1 ] [ 0 ] = 1 ; Bmの[ 2 ] [ 0 ] = 1 ; 一方、(N-) { IF(&N- 1 ) B = MUL(B); // ここで、行列の左の乗算と右乗算は同じではないことに注意してください、同じではない対応する係数行列 A = MUL(A); N- >> = 1 ; } 戻りB; } int型のmain() { T、N- LL。 CIN >> T; 一方(T-- ) { CIN >> N-; MAT A; // 行列Aは係数行列(伝達行列)である アム[ 0 ] [ 0 ] = 1 ; アム[ 0 [] 。1 ] = 4 ; アム[ 0 ] [ 2 ] = 7 ; アム[ 1。 [] 0 ] = 2 ; アム[ 1 ] [ 1。 =] 5。; [AM 。1 ] [ 2 ] =8; AM [ 2 ] [ 0 ] = 3 ; AM [ 2 ] [ 1 ] = 6 。 AM [ 2 ] [ 2 ] = 9 。 もし(N == 1 ) { のprintf(" 3 \ n " ); } // そうであれば(N == 2) // { // のprintf( "45 \ n"); // } 他 { マットB = POW(A、N- 1 )。 LL ANS = Bmを[0 ] [ 0 ] + Bmの[ 1 ] [ 0 ] + Bmの[ 2 ] [ 0 ]。 printf(" %LLDする\ n "、ANS%のMOD)。 } } 戻り 0 。 }