暴力:
正解:
[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今= 1。int型最後= 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 }