有 \(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...