P4859 已經沒有什麼好害怕的了(二項式反演)

2022-03-16 23:32:39 字數 1262 閱讀 1687

顯然是恰好有\(\frac\)組\(a>b\)

令\(f(i,j)\)表示前\(i\)個糖果,已經有\(j\)組\(a>b\),剩下的沒管的方案數

對\(a\)陣列從小到大排序,設\(r_i\)表示比\(a_i\)小的\(b\)個數,那麼\(r_i\)是遞增的

有狀態轉移方程\(f(i,j) = f(i-1,j) + f(i-1,j-1) \times (r_i-j+1)\)

對於每個\(f(n,i)\),由於剩下的\(n-i\)對不知道大小情況,那麼有\(f(n,i)\times (n-i)!\)種情況至少有\(i\)個匹配

設\(g_i\)表示恰好有\(i\)個匹配,那麼\(f(n,i) \times (n-i)! = \sigma_^n c(j,i)\times g_i\)

二項式反演後就是\(g_i = \sigma_^n (-1)^c(j,i)\times f(n,j)\times (n-j)!\)

#include#define n 2005 

using namespace std;

typedef long long ll;

const ll mod = 1000000009;

int n,k,a[n],b[n],r[n];

ll f[n][n];

ll fac[n],ifac[n];

template inline t max(t a,t b)

template inline t min(t a,t b)

template void read(t &x)

ll qp(ll a,ll b)

ll c(int n,int m)

void init(int maxn)

int main()

for(int i=1;i<=n;++i)

for(int j=1;j<=n;++j)

r[i]+=(a[i]>b[j]);

init(2000);

f[0][0]=1;

for(int i=1;i<=n;++i)

ll ans=0;

k=(n+k)/2;

for(int i=k;i<=n;++i) ans = (ans + ((i-k)&1 ? -1 : 1) * c(i,k) * f[n][i]%mod *fac[n-i]%mod)%mod;

printf("%lld\n",(ans%mod+mod)%mod);

return 0;

}

P4859 已經沒有什麼好害怕的了

設 a i 表示第 i 個糖果的能量,b i 表示第 i 個藥片的能量 首先可以得出滿足條件時,a b 的對數為 frac 因為恰好為 i 的方案數不好求,我們先求出至少為 i 的方案數,之後用二項式反演求出答案。先將 a,b 從小到大排序。設 h 表示前 i 個糖果,至少選了 j 對 a b 的方...

P4859 已經沒有什麼好害怕的了

有 a 和 b 兩個長度為 n 的序列,其中元素兩兩配對,a b 的配對需比 a的配對多恰好 k 個,求方案數 我們設 f 為前 i 個 a 中,選了 j 組 a b 的方案數 可得狀態轉移方程 f f f l i j 1 l i 表示離 a i 最近的乙個 b 再設 g i 為 geq i 個的配...

洛谷 P4859 已經沒有什麼好害怕的了 解題報告

已經使 tt 有簽訂契約,和自己一起戰鬥的想法後,tt 忽然感到自己不再是孤單一人了呢。於是,之前的謹慎的戰鬥作風也消失了,在對 tt 的傀儡使用終曲 tt 後,tt 面臨著即將被 tt 的本體吃掉的局面。這時,已經多次面對過 tt 的 tt 告訴了學 oi 的你這樣乙個性質 tt 的結界中有兩種具...