CCA的小球 組合數學 容斥原理

2021-10-22 23:19:30 字數 1124 閱讀 8202

給定 n 個小球,每個小球有顏色,要將它們擺成一行 。

兩個方案不同,當且僅當存在某個位置,兩種方案擺在這個位置的小球顏色不同。

乙個方案合法, 當且僅當不存在任意兩個位置相鄰的小球顏色相同,求合法方案數對 10^9+7 取模後的值 。

首先考慮取反面計算。考慮"兩個方案不同,當且僅當存在某個位置,兩種方案擺在這個位置的小球顏色不同。"如何計算總方案數。

我們直接沒有任何限制的就是fac[n],但是不能有兩個位置顏色同的。我們用fac算的時候把b的兩個顏色即b1,b2算成了不同的兩個方案。實際上一樣的。所以對於fac[n]裡的所有方案數,b1,b2有fac[2](2x1)的總方案數的重複,所以總方案數就是(cnt表示顏色為2的個數) fac[n]/(2^cnt)

然後總共重複最多5e5.我們考慮容斥。記si為存在兩個位置相鄰的小球顏色相同。

ans=總數-| s1∪s2∪s3......∪scnt|

也就是減去s1,s2,s3...scnt,

加上s1∩s2,s1∩s3......

考慮怎麼求只有一對顏色不同的。首先一對有c(m,1)種選法。既然條件是相鄰位置,我們把這對顏色同的小球**。那麼此時剩下的小球有n-i個,全排列是fac[n-i],那麼此時還要考慮其他顏色的滿足第乙個條件的狀態,fac[n-i]/(2^(cnt-1) 【和最開始的處理合法總數一樣】

#include#include#include#include#include#include#include#include#include#include#define debug(a) cout<<#a<<"="ll ksm(ll a,ll k)

return res%mod;

}void init()

ll c(ll n,ll m)

int main(void)

else map1[a[i]]=1;

} ll ans=(fac[n]%mod*inv1[cnt]+mod)%mod;

for(ll i=1;i<=cnt;i++)

else

ans=(ans+mod)%mod;

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

return 0;

}

錯排問題 組合數學 容斥原理

3.錯排問題 problem 題目描述 n本不同的書放在書架上。其中m本書已經重新擺放好,將剩下的n m 本書也重新擺放,使每本書都不在原來放的位置。求有幾種擺法。輸入資料 第1行兩個數n,m 接下來m行,每行兩個數xi,yi表示原來的第xi本書已經放到了第yi 個位置上資料保證任意兩個x不相同,任...

組合數學 容斥原理和錯位排列

真的,學了組合數學你會克服公式恐懼症0.0深有體會 設a 1,a2 a n 為有限集合,用 a i 表示集合ai 中的元素個數那麼有這樣的結論 a 1 a2 a n i 1n ai 1 in ai aj 1 i jn ai aj ak 1 n 1 a1 a2 an 總的概括就是奇數個集合的並集累加和...

bzoj 4710(組合數學 容斥原理)

傳送門 題解 先介紹一條公式 將n個物品分給m個人有c n m 1,m 1 種方案。但是這些方案是包括了不合法的 有些人沒有獲得任何物品 對於這道題,需要保證所有人都分到物品,所以容斥原理解決 ans 0個人沒分到 1個人沒分到 2個人沒分到 n個人沒分到 對於某一種情況 i個人沒分到 當前方案數 ...