4665 小w的喜糖

2021-09-10 05:18:31 字數 1138 閱讀 6682

求數字可重的錯排。

考慮2

n2^n

2n容斥,列舉哪些位一樣,就是∑t∈

s(−1

)∣t∣

(n−∣

t∣)!

π(ai

−bi)

!\sum_(-1)^\frac

∑t∈s​(

−1)∣

t∣π(

ai​−

bi​)

!(n−

∣t∣)

!​其中b

ib_i

bi​為每種顏色已用個數。

考慮dp這個式子,f[i

][j]

f[i][j]

f[i][j

]表示前i種顏色,用了j個,式子下面逆元積的和。

列舉每種顏色用多少即可。

code:

#include

#include

#include

#include

#define ll long long

using

namespace std;

const ll mod=

1e9+9;

ll fac[

2010

],inv[

2010

],n;

ll a[

2010];

void

pre(

)ll f[

2010

],g[

2010];

intc

(int m,

int n)

intmain()

f[0]=

1;ll tot=0;

for(ll i=

1;i<=n;i++

) ll ans=0;

for(ll i=

0;i<=n;i++

)(ans+=(

(i&1)?

-1:1

)*f[i]

*fac[n-i]

%mod)

%=mod;

printf

("%lld"

,(ans+mod)

%mod)

;}

BZOJ4665 小w的喜糖

考慮列舉哪些人一定不合法,那麼方案數可以通過簡單的排列組合算出。於是設 f i j 表示前 i 種糖果,一共有 j 個人一定不合法的方案數,但是這樣並不能保證其他人一定合法,所以需要進行容斥。最後將答案除以每種糖果數量的階乘,即可保證本質不同。時間複雜度 o n 2 includeconst int...

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 的數的個數 然後發現每個位置都要不同的限制很麻煩,...