効果の件名:
(1,1)からのn * mの正方行列、(n、m)は、唯一、(1,1)、右または下に行くことができますが、最初のスコアSを持って来ると考えます。図面全体を通してK特別な点で、各ポイントを介して、現在の残りの部分は、2で除算し、切り上げします。所望のスコアの(N、M)に(1,1)を探しています。
1 <= N、M <= 1E5; 0 <= K <= 2000; 1 <= S <= 1E6。
DP +および除外。
- 要件は、とにかく、良いまあを見つけることを期待問題の章ソリューションの答えが唯一のポイントkの特別なプログラムの数をカウントした後、なぜ、私は理解していません
- N、M <= 1E5に、明らかにポイントの暴力、列挙することはできませんn個のYY複雑な自由、メートルを、私たちは、特定のポイントを列挙することができます。
- 注意深い分析、発見したK>がログインしたとき2 S(N、M)の値に1秒の時間を。だから、特別な20ポイント程度の最大値を列挙する。
- 列挙特別な点は、水平軸に対して第1のキーワード、垂直軸と第2キーワードである、注文の特別ポイントになります。
- そして、包含と除外はああを行います
- 後方に来ます。
- ああ、そして、この質問ルーカス定理、逆に。
D [i] [j]はプログラムの合計数を表すようによれば、iがjはポイントツーポイントから来る一次我々は、Dを知ることができる組み合わせの数[I] [J] = C([J] .xa [i]は・X + A [J] .ya [J] .X 、[J] .X - [I] .X)
G [i] [j]は(M、N)、iに示し設定直後(点Iを含まない)、j番目のバリアポイントプログラムの数。
見つけるのは明らかに非常に難しいです。その後、我々は補助変数を追加し、F [I] [j]はiが点(N、M)からポイントを示し、少なくとも後のいくつかのポイントプログラム、J。
Jマイナスポイントの数よりも多くを合計するプログラムの配列を求めて、Fので。
Σ(G [K] [J] * D [i]が[K])、满足[K] .X> = [I - 、F [i]とは、[j]は、Dを[I] [(N、M)= ] .X、[K]・Y> = A [i]の.Y。
所以、G [i]は[J] = F [I] [J] - F [I] [J-1]。
プレフィックスとに多少似ています。
コードは一緒に合併しました。
コード:
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型のmod = 1000000007 ; const int型 MAXN = 2E5 + 5 。 INT [ 30 ]、FAC [MAXN]、INE [MAXN]、G [MAXN] [ 30 ]。 構造体ノード{ int型X、Y。 } E [ 3000 ]。 ブールCMP(ノードA、ノードB){ 戻り AX == BX AY <によって:AX < BX。 } INT C(int型のx、int型のY){ 戻り 1LLの*のFAC [X] * INE [Y]%のMOD * INE [XY]%MOD。 } INT qpow(int型のx、int型のY){ int型の CNT = 1 。 一方、(Y){ 場合(Y&1)CNT = CNT 1LL * * X%MOD。 yは >> = 1 ; X = 1LL * X * X%MOD。 } 戻りCNT。 } int型のmain(){ int型N、M、K、S。 CIN >> N >> M >> K >> S。 FAC [ 0 ] = 1 ; 以下のために(int型 i = 1 ; iが<= N + M; ++ I)FAC [i]は= 1LL * FAC [I- 1 ] * I%モッズ; INE [N + M] = qpow(FAC [N + M]、mod- 2 )。 以下のために(int型 I = N + M、I> = 1 ; - I)INE [I- 1 ] = 1LL * INE [I] *(I)%MOD。 INT LEN = 0 ; [ 0 ] =のS。 用(LEN = 1!; S = 1 ; LEN ++)[LEN = S =(S + 1)/ 2 。 LEN - ; 以下のために(int型 i = 1 ; iは= Kを<; ++ I)CIN >> E [I] .X >> E [I] .Y。 ソート(E + 1、E + K + 1、CMP); E [ 0 ] .X = E [ 0 ] .Y = 1 。 用(int型 ; I> = I = Kを0 - ; {I) のために(INT J = 0 ; J <LEN; ++ J){ G [I] [J] = C(NE [I]・X +私[i]は.Y、N- E [i]の.X)。 用(int型 L = K、L> I; - L){ 場合(E [I] .Y <= E [L] .Y){ G [I] [J] =(G [I] [J] -1ll * Gの[1] [J] * C(E [L] .xe [I]・X + E [L] .ye [I]・Y、E [L] .xe [I] .X)) %モッズ; } } } //上面的G数组相当于F数组。 G [i]は[LEN] = C(NE [I] .X私+ [I] .Y、NE [I] .X)。 用(INT J = LENあり、j> = 1 ; - j)のG [I] [J] =(G [I] [J] -g [I]、[J- 1 ])%MOD。 } INT ANS = 0 。 以下のために(int型 i = 0 ; = iが<LEN; ++ I)ANS =(ANS + 1LL *(G [ 0 ] [I] + MOD)* [I])%MOD。 ANS = 1LL * ANS * qpow(C(N + M- 2、N- 1)、mod- 2)%MOD。 coutの << ANS << てendl; }