B. RGB工場

B. RGB工場

テストあたりの時間制限
2.0秒
テストごとのメモリ制限
64メガバイト
入力
標準入力
出力
標準出力

ファーマージョンは最近、彼の家の周りにそれらを植えるために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)。各テストケースは、単一の整数を含む単一の行から成る  N1≤  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 
}

 

おすすめ

転載: www.cnblogs.com/-citywall123/p/11222996.html