問題の意味:n個×m個のボードは、あなたの最初のポイント(1、1)、あなたはポイント(N、M)を取得する必要があるで、そこにあります。あなたはsの最初のポイントを持って、ボード上のk個の点があり、この点の数分の後(切り上げ)S / 2になり、最初から楽譜の最後に数学的期待値を尋ねる数ですか?
アイデア:ルーチンによれば、ポイントを保存少なくともj番目を通して前のI点から[I] [J] DP設けK最初の点対ソート方法は、私は、数学的期待点です。そして、すべてのそれは前にそれに転送することができ時点でそれに移しました。次にDP [I] [J] =Σ(DP [U] [J - 1] - DP [U] [J])* G(U、I)。G(U、i)はuの間を移動の数であり、iは何ら制約条件ではなく、数学的な計算方法の組み合わせであってもよいです。これは、正確に+ jを複数の点を通る再カウントがリークを保証されないことができない転送モード、上を通過することができる以上の点に相当します。
コード:
#include <ビット/ STDC ++ H> に#define INF 0x3f3f3f3f の#define DB倍 の#defineが長い長いLL の#define PII対<整数、整数> 名前空間stdを使用。 const int型MAXN = 200010; CONST LLのMOD = 1E9 + 7。 LL DP [2010] [40]。 PII [2010]。 LLのV [MAXN]、[MAXN] INV。 LLのqpow(LLのX、LL Y){ LL ANS = 1。 (; Y、Y >> = 1)のために{ (ANS * X)%MOD(Y&1)であればANS =。 X =(X * X)%MOD。 } 戻りANS。 } ボイドのinit(int型N){ V [0] = 1。 以下のために(INT i = 1; iが<= N; iは++){ V [I] =(V [I - 1] * I)%MOD。 } INV [N] = qpow(V [n]は、MOD - 2)。 ため(INT I = N - 1; I> = 0; i--){ INV [I] =(INV [I + 1] *(I + 1))%MOD。 } } LL C(LL N、LL M){ リターン([N - M] INV((V [N] * INV [M])%のMOD)*)%MOD。 } LL CAL(int型のx、int型のY){ LL TMP = ABS([Y] 1次回- [X] 1次回)、TMP1 = TMP +([Y] .second - [X] .second) ; C(TMP1、TMP)を返します。 } LLのB [50]。 INTのmain(){ int型N、M、K、T。 scanf関数( "%D%D%D%D"、&N、&M、&K、&T)。 INIT(N + M)。 {ため(; iは= Kを<I ++はI = 1 INT) のscanf( "%d個の%のD"、&[i]が1次回、&[I] .second)。 } INT LIM = 0。 (T> 1){ながら B [++ LIM] = T。 T =(T + 1)/ 2。 } B [++ LIM] = 1。 B [LIM + 1] = 1。 ソート(+ 1、A + 1 + K)。 K ++; [K] = make_pair(N、M)。 {(;私は= Kを<I ++はiは1 = INT)のための ( - 2、[i]が1次回- 1 [i]が1次回+ [I] .second)のDPを[I] [0] = C ; } LL ANS = 0。 (INT J = 1; J <= LIM; J ++)のための{ (I = 1をint型;私は= Kを<I ++の)のための{ {(T ++ INT T = 1; T <i)について ([T]であれば1次回<= [i]が1次回&& A [T] .second <= [I] .second){ LLのTMP1 =(DP [T] [J - 1] - DP [T] [J] + MOD )%のMOD。 LL TMP2 = CAL(T、I)。 アサート(TMP1> = 0)。 アサート(TMP2> = 0)。 DP [I] [J] + =(TMP1 * TMP2)%のMOD。 DP [I] [J]%= MOD。 } } } } {(; I <= LIM I ++はiが0 = INT)のために 、DP [K] [I + 1] + MOD)%のMOD)* B [I - ANS =(ANS +(((DP [K] [I] + 1])%のMOD)%MOD。 } ANS =(ANS * qpow(C(N + M - 2、N - 1)、MOD - 2))%MOD。 printf( "%LLDする\ n"、ANS)。 }