顯然是恰好有\(\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 的結界中有兩種具...