設\(a_i\)表示第\(i\)個糖果的能量,\(b_i\)表示第\(i\)個藥片的能量
首先可以得出滿足條件時,\(a>b\)的對數為\(\frac\)。
因為恰好為\(i\)的方案數不好求,我們先求出至少為\(i\)的方案數,之後用二項式反演求出答案。
先將\(a,b\)從小到大排序。
設\(h_\)表示前\(i\)個糖果,至少選了\(j\)對\(a>b\)的方案數,\(cnt_i\)表示比第\(i\)個糖果小的藥片數目。
有:\(h_=h_+(cnt_i-(j-1))*h_\)
設\(f_i\)表示恰好\(i\)對\(a>b\)的方案數,\(g_i\)表示至少\(i\)對\(a>b\)的方案數。
顯然有\(g_i=f_*(n-i)!\),之後二項式反演即可。
code:
#includeusing namespace std;
const int maxn=2010;
const int mod=1e9+9;
int n,m,ans;
int a[maxn],b[maxn],cnt[maxn],g[maxn],fac[maxn],inv[maxn];
int f[maxn][maxn];
inline int power(int x,int k)
return res;
}inline int c(int n,int m)
for(int i=0;i<=n;i++)f[i][0]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
f[i][j]=(f[i-1][j]+1ll*max(0,cnt[i]-(j-1))*f[i-1][j-1]%mod)%mod;
for(int i=0;i<=n;i++)g[i]=1ll*f[n][i]*fac[n-i]%mod;
for(int i=m;i<=n;i++)
if((i-m)&1)ans=(ans-1ll*c(i,m)*g[i]%mod+mod)%mod;
else ans=(ans+1ll*c(i,m)*g[i]%mod)%mod;
printf("%d",ans);
return 0;
}
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 的結界中有兩種具...
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...