BZOJ4665 小w的喜糖

2021-09-09 02:09:30 字數 650 閱讀 9896

考慮列舉哪些人一定不合法,那麼方案數可以通過簡單的排列組合算出。

於是設$f[i][j]$表示前$i$種糖果,一共有$j$個人一定不合法的方案數,但是這樣並不能保證其他人一定合法,所以需要進行容斥。

最後將答案除以每種糖果數量的階乘,即可保證本質不同。

時間複雜度$o(n^2)$。

#includeconst int n=2005,p=1000000009;

int n,i,j,k,x,a[n],c[n][n],fac[n],inv[n],f[n][n],tmp,ans;

int main()

for(i=2;i<=n;i++)inv[i]=1ll*inv[i]*inv[i-1]%p;

for(f[0][0]=i=1;i<=n;i++)for(j=0;j<=n;j++)for(k=0;k<=a[i]&&k<=j;k++)

f[i][j]=(1ll*f[i-1][j-k]*c[a[i]][k]%p*fac[a[i]]%p*inv[a[i]-k]+f[i][j])%p;

for(i=0;i<=n;i++)

for(i=1;i<=n;i++)ans=1ll*ans*inv[a[i]]%p;

return printf("%d",ans),0;

}

BZOJ 4665 小w的喜糖

題鏈 題解 容斥,dp 令 v i 表示原來擁有i類糖果的人數。乙個套路,首先把每個糖果看成互不相同的,最後再來除以 v i 把同種糖果看成相同的 定義 dp i j 表示前i類糖果,有j個人的糖果和原來的一樣,其他 n j 個人暫時不拿糖果的方案數。這個的轉移如下 對於已經確定的 i,j,列舉乙個...

BZOJ 4665 小w的喜糖

傳送門 見計數想容斥 顯然每個人交換後可以變成任意的排列 所以就是求對於所有排列使得每個位置的值都和一開始的值不同 感覺同乙個值算同乙個數不太好搞,考慮把所有數都看成不同的,最後答案再除 prod fac cnt i 其中 cnt i 表示值為 i 的數的個數 然後發現每個位置都要不同的限制很麻煩,...

BZOJ4665 小w的喜糖 DP

對於這道題,首先每個人的位置並不影響結果 所以我們可以將相同顏色糖果的人放在一塊處理 設 f 表示處理到第 i 種糖果至少有 j 人的糖果和原先的型別相同 列舉當前種類中不滿足要求的個數 則有 f sum f binom dfrac k ans sum n n i c i 表示第 i 種糖的個數,這...