BZOJ4665 小w的喜糖 DP

2022-08-14 05:00:08 字數 1003 閱讀 4202

對於這道題,首先每個人的位置並不影響結果 所以我們可以將相同顏色糖果的人放在一塊處理

設 \(f_\) 表示處理到第 \(i\) 種糖果至少有 \(j\) 人的糖果和原先的型別相同 列舉當前種類中不滿足要求的個數 則有

\[f_=\sum_^ f_*\binom* \dfrac-k)!}

\]\[ans=\sum_^n *(n-i)!}

\]\(c_i\) 表示第 \(i\) 種糖的個數,這裡之所以要乘上 \((c_i-k)!\) 的逆元 是因為我們還不確定這些人究竟是否滿足要求 先將它們的順序除去 在最後統計時我們再給所有剩下的人分配乙個糖果即可 結果當然要容斥一下啦~~

#includeusing namespace std;

#define fo(x)

#define pa pair#define mod 1000000009

#define ll long long

#define mk make_pair

#define pb push_back

#define fi fisrt

#define se second

#define cl(x) memset(x,0,sizeof x)

#ifdef devil_gary

#define bug(x) cout<<(#x)<<" "<<(x)<'9')

while(ch>='0'&&ch<='9')

return rev?-x:x;

}int n,ans,tot,f[n][n],col[n],bin[n],inv[n];

void init()

int c(int n,int m)

int main()

for(int i=0;i<=n;i++) ans=(ans+(ll)((i&1)?mod-1:1)*f[n][i]%mod*bin[n-i]%mod)%mod;

return !printf("%d\n",ans);

}

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