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

2022-05-24 13:51:11 字數 1441 閱讀 3550

有 \(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\) 個的配對方案數, \(h_i\) 為恰好 \(=i\) 個的方案數,可得 \(g_i=f_*(n-i)!\)

且容易得, \(f_i\) 在 \(g_j\) 中算了 \((^i_j)\) 次

所以,得到:

\[g(k)=\sum\limits_^n\dbinom ikf(i)

\]由二項式反演,得:

\[f(k)=\sum\limits_^n(-1)^\dbinom ikg(i)

\]**

#include#include#include#include#define ll long long

using namespace std;

const int n=2005,mod=1e9+9;

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

ll f[n][n],fac[n],inv[n],fac_inv[n];

int g[n];

inline int read()

while(isdigit(ch))

return x*f;

}inline void init()

}inline ll c(int n,int m)

int main()

k+=(n-k)/2;

for(int i=1;i<=n;i++) a[i]=read();

for(int i=1;i<=n;i++) b[i]=read();

sort(a+1,a+n+1);

sort(b+1,b+n+1);

init();

int now=0;

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

for(int i=0;i<=n;i++) f[i][0]=1;

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

for(int j=1;j<=g[i];j++)

f[i][j]=(f[i-1][j]+f[i-1][j-1]*(g[i]-j+1)%mod)%mod;

ll ans=0;

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

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

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

return 0;

}

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

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

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

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

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

顯然是恰好有 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...