bzoj 3622 DP + 容斥
LINK
題意:給出n,k,有a,b兩種值,a和b間互相配對,求$a>b$的配對組數-b>a的配對組數恰好等於k的情況有多少種。
思路:粗看會想這是道容斥組合題,但關鍵在於如何得到每個a[i]大於b的組數。
不妨從整體去考慮,使用$f[n][j]$代表前n個中有j組$a[i]>b[i]$,很容易得到轉移式$f[n][j]=f[n-1][j]+f[n-1][j-1]*(cnt[n]-(j-1))$,其中$cnt[i]$為比a[i]小的b[]個數
但是仔細思考該式子含義會發現,$f[n][j]$得到的是不小於j組滿足a[i]>b[]的數,會造成大於j組數情況的重復計入
我們定義$dp[n][i]$代表選取i組恰好糖果大於藥片的方案 也就是正確答案
那麽實際上總情況有$dp[n][i] = f[n][i]*(n-i)! $即剩下n-i個數自由配對 有$(n-i)!$種
重復情況為任意選取大於i(i+1~n)的 並在其中無序選出i個的種類數 即 $\sum^{n}_{j=i+1}{dp[n][i]*C(j,i)}$
/** @Date : 2017-07-17 16:15:38 * @FileName: bzoj 3622 DP + 容斥.cpp * @Platform: Windows * @Author : Lweleth ([email protected]
bzoj 3622 DP + 容斥