「アナログ8.21」洞窟(行列の最適化DP)

暴力:

 

正解:

[I] [j]はiがjは点から点へのプログラムの数を表し、fは、循環行列を考えます

私たちは、[I] [J] fをn回を前処理し、nが小さいことがわかりました

そして、迅速なパワーマトリックスでは、我々は現在のFをしたい[I] [J] * F [J] [K] - >モミ[I] [J]

しかし、この時間は、サイクルは3であります

私たちは、jが0-N N×2回ではn + 1に転送され、伝達方程式ijの意義を考えます

だから、今回のJKで、あなたは実際には本質的に同じ手順JKを上に行くためにゼロからとして彼を見ることができます

そして、特別な裁判官があり、それについて話をしません

         INT J = 0 ; J <N; ++ J)
         {              
             FF [今] [J] =(FF [今] [J] + FF [最終] [((JI)+ N)%のN])%モッズ;
             もし((((JI)+ N)%N)==(J + I)%n)で続けます
             FF [今] [J] =(FF [今] [J] + FF [最終] [(J + I)%のN])%MOD。    
         }

 

コード

1つの#include <ビット/ STDC ++ H>
 2  の#define INT長い長い
 3  の#define MAXN 4001
 4  使用して 名前空間STD。
5  INT C [MAXN]、[MAXN] F、モミ[MAXN]。
6  INTのN、M。
7  のconst  int型 MOD = 1E9 + 7 8  ボイドチェン(int型K)
 9  {
 10       のmemset(C、0はsizeof (c)参照)。
11       であれば(kは== 1 12       {
 13          のためにint型 i = 0 ; iがN <; ++ I)
 14          {
 15              のためのint型 J = 0 ; nはJ <; ++ j)の
 16              {
 17個の                 C [(iはJ +)%のN] =(Cの[(I + J)%のN] + F [j] * [i]が+ MOD)%のF MOD。            
18                 // 続ける(iは2 ==(J + I)%nを*)であれば、
19              }
 20          }
 21          のためのint型 I = 0 ; iがN <; ++ i)は、[I] =のC [i]は%fをMOD。
22       }    
 23       他の
24       {
 25          のためにINTi = 0 ; iがn <; ++ I)
 26          {
 27              のためのint型 J = 0 ; J <N; ++ j)の
 28              {
 29個の                  C [(iはJ +)%のN] =(Cの[(I + J)%のN] + FIR [J] * F [I] + MOD)%MOD。                
30                  // (iは2 ==((jは* + i)が%のN))続行。
31              }
 32          }
 33          のためのint型 I = 0 ; iがN <; ++ i)はFIR [I] = cを[I]%MOD。
34       }
 35  }
 36  空隙 poww(INTのY)
 37 {
 38       FIR [ 0 ] = 1LL。
39       一方、(Y)
 40       {
 41           であれば(Y&1LL)チェン(2LL)。
42           チェン(1LL)。
43           Y >> = 1LL。
44       }
 45  }
 46  INT FF [4LL] [MAXN]。INT G [MAXN]。
47  INT今、最後の; int型ANS [MAXN]。
48は、 署名されたmain()の
 49  {
 50       // freopenは( "text.in"、 "R"、STDIN)。
51       // freopenは( "1.out"、 "W"、STDOUT)。
52      scanf関数(" %のLLDの%のLLD "、&​​N、&M)。
53       INT今= 1int型最後= 0 ;
54個の       FF [ 0 ] [ 0 ] = 1 55       のためにint型 I = 1 <; = N ++ iがI)
 56       {
 57の          場合(I> 1 58           {
 59               スワップ(今、最後)のmemset(FF [今]、0はsizeof (FF [今]))。
60           }
 61          INT J = 0 ; J <N; ++ j)の
 62           {             
 63個の               FF [今] [J] =(FF [今] [J] + FF [最終] [((JI)+ N)%のN] )%のMOD。
64               であれば((((JI)+ N)%N)==(J + I)%n)で続けます65個の               FF [今] [J] =(FF [今] [J] + FF [最終] [(J + I)%のN])%MOD。    
66           }
 67           であれば(I == Mの%のN)
 68           {
 69              のためにINT J = 0 ; J <N; ++ j)の
 70              {
 71                 G [J] = FFの[今] [j]は%モッズ;
72              }
 73           }
 74           であれば(I == M)
 75           {
 76              のprintf(" %LLDする\ n " [今] FF、[ 0 ])。
77              リターン 0 78           }
 79       }
 80       のためのint型 I = 0 ; iがN <; ++ i)の
 81       {
 82          F [I] = FFの[今] [I]%MOD。
83       }
 84       poww(M / N)。
85       のためにint型 i = 0 ; iがN <; ++ I)
 86       {
 87           のためにINT J = 0 ; J <N; ++ j)の
 88           {
 89               // もし(iは2 ==((J + I)%を* n))を続けます。
90の               ANS [(私はJ + 1)%のN] =(ANS [(私はJ + 1)%のN] +(G [i]が*モミ[J])MOD +%MOD)%MOD。
91           }
 92       }
 93       かの(M個の%のN)
 94       のprintf(" %のLLDを\ n "、ANS [ 0 ]%のMOD)。
95       のprintf(" %LLDの\ nを"、FIR [ 0 ]%のMOD)。
96 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/Wwb123/p/11421020.html