その日、私たちは約束した大会(組合せ論、DP)

深く懐疑的な人々は愛から落ちるされていないトピックのタイトル名、拷問たちの、その後、質問をお読みください。そして、楽しいこの問題は、暴力と呼ばれ、最終的には何とかWA20、悲しい.....

DPは暴力うち正のソリューションをに従事するが、どこに行くためにも差がない場合には実際には、この問題は、正の解を考えるのは難しいことではありません

私たちは、暴力のこの質問の場合ことがわかりました

Dは、列挙、すなわち一日、別のビスケットは、現在の番号jは、層は、ビスケット層の数が列挙されている(また、接頭辞によって省略することも当然の一次元)を列挙得

しかし、我々は、データ範囲を観察し、大きなDを発見しました!

もちろんD列挙を表示されません

どうやら文字を使用すると、N個のビスケットを持っている場合は、その後、N日の最高に、完了するために一日を与えるだろう、そこにあります。

だから最初の次元は毎日表現するには、特定の、Nを列挙します

統計最後の答え(I:1〜N)[I] [N] F * C(D、I);することができます

(この問題はD大きすぎる、それは、逆元を使用弾性率再帰O(N)要求、*(DI)を使用するか、嵐であろうことはできません)

 

1の#include <iostreamの>
 2の#include <cstdioを>
 3の#include <CStringの>
 4の#include < ストリング >
 5の#include <cmath>
 6の#include <アルゴリズム>
 7  の#defineっ長い長
 8  使用 名前空間STDを、
9  の#define MAXN 2010
 10  CONST = LL MOD 998244353 11  LLのF [MAXN] [MAXN]。
12  LLのN、D、M。
13の LL NI [MAXN]、ni_c [MAXN]。
14  LL [MAXN] [MAXN]。
15  LLのMAX1(LLのX、LLのY)
 16  {
17     リターン(X> Y)?X:Y。
18  }
 19  LL MIN1(LL X、LLのY)
 20  {
 21     リターン(X <Y)?X:Y。
22  }
 23  空隙ワーク()
 24  {
 25     Fは[ 0 ] [ 0 ] = 1 ; [ 0 ] [ 0 ] = 1 ;   
26     のために(LL i = 1 ; iが<= N; ++ I)
 27     {
 28         のLL R =分(N、(M- 1)* I)。   
29         (LL jを=1 ; J <= N; ++ j)の
 30         {
 31             [I- 1 ] [j] =([I- 1 ] [J- 1 ] + F [I- 1 ] [J] + MOD)%モッズ;
32         }   
 33         (LL用J = I; J <= R; ++ j)の
 34         {
 35             のLL L = MAX1(I- 1、J-M + 1 )。
36             / * ため(LLのK = L; K <= J-1; ++ K)
 37             {
 38                F [I] [J] =(F [I] [J] + F [I-1] [K] )%のMOD。
39             } * / 
40             F [I] [J] =(F [I] [J]%MOD +([1-1 ] [J- 1 ] -a [I- 1 ] [L- 1 ] + MOD)%のMOD + MOD)%MOD。
41             // のprintf( "F [%のLLD] [%のLLD] =%LLDする\ n"、I、J、F [i]は[J])。
42         }
 43     }
 44     LL和= 0LL; LL ANS = 1LL。
45     のためには、(LL i = 1 ; iが<= N; ++ I)
 46     {
 47        であれば(I> D)を続けます48の        ANS =(ANS *((D-I + 1)%のMOD)+ MOD)%MOD。
49        和=(和+(F [i]が[N] *(ANS * ni_c [I]%のMOD + MOD)+ MOD)%のMOD + MOD)%MOD。
50        //printf( "%= LLD C =%LLD \ F N"、[I] [N] F、C(D、I))。
51     }
 52     のprintf(" %LLDする\ n "、和%のMOD)。
53  }
 54  のint main()の
 55  {
 56   //   freopenは( "text.in"、 "R"、STDIN)。
57   //   freopenは( "wa.out"、 "W"、STDOUT)。
58     ni_c [ 1 ] = 1 ; NIを[ 1 ] = 1 59     ni_c [ 0 ] = 1 ; NIを[ 0 ] = 1 ;
60     のために(LL I = 2;私は= < 2000 ; ++ i)の
 61     {
 62         NI [I] =((MOD-MOD / I)* NI [MOD%のI])%MOD。
63         ni_c [I] =(ni_c [I- 1 ] * NI [I])%MOD。
64     }
 65     ながら(CIN >> N >> D >> M)
 66     {
 67        であれば(Nの== 0 && Dの== 0 && M == 0破ります68        のmemset(F、0はsizeof (F))。
69        のmemset(0はsizeof (a)参照)。
70       作業();
71     }
 72 }
コードの表示

 

おすすめ

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