牛客練習賽64 D寶石裝箱

2022-05-21 04:25:59 字數 1265 閱讀 3648

n 顆寶石裝進 n 個箱子使得 , 每個箱子中都有一顆寶石

其中第 i 顆寶石不能裝入第 ai 個箱子 , 求合法的裝箱方案數。

總的裝箱方案為 n! ,答案 = 總方案數 - $\sum ^_f\left( i\right)  $ , 其中 f(x) 表示 x 個箱子不合法的方案數

我們定義 dp[i][j] 表示前 i 個箱子有 j 個放了不合法的寶石 , 其它 n - i 個箱子先不放寶石的方案數

那麼 $dp_=dp_+dp_\times a_$ , 前 n 個箱子至少有 i 個不合法的方案數為 $dp_\times \left( n-i\right) !$

於是根據容斥可得

\beginans=n!-\sum ^_\left( -1\right) ^\times dp_\times \left( n-i\right) !\\

=\sum ^_\left( -1\right) ^\times dp_\times \left( n-i\right) !\end

因為我們最後只需要用到 dp[n][i],

而 dp[i][j] 又只會由 dp[i - 1][j] 、dp[i - 1][j - 1] 轉移得到

所以我們可以用揹包問題優化空間方法的方法優化它

#include#define int long long

using

namespace

std;

const

int n = 8e3 + 10

;const

int mod = 998244353

;int

a[n] , fac[n] , dp[n];

void

init()

signed main()

dp[0] = 1

;

for(int i = 1 ; i <= n ; i ++)

for(int j = i ; j >= 1 ; j --)

dp[j] += dp[j - 1] * a[i] , dp[j] %=mod;

int ans = 0

;

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

cout

<< ans << '\n'

;

return0;

}

牛客練習賽64 D

容斥原理經典題 第i ii個物品不能放在a ia i ai 箱子裡,求每個箱子有乙個物品的方案數 經典題目 之前做了一道題,需要crt crtcr t合併 此題 也是要考慮到容斥,那題處理方式是利用dpdp dp,因為有個類似上公升子串行的遞推關係,dp i dp i dp i 表示第乙個不合法的情...

牛客練習賽64 題解

a 怪盜 1412題目描述 乙個長度為n m k包含n個數字1,m個數字2和k個數字4的陣列,最多可能有多少個子序列1412?如果乙個序列是陣列的子串行,當且僅當這個序列可以由陣列刪去任意個元素,再將陣列中的剩餘元素按順序排列而成。思路 將序列排列成111444441111222222,這樣可以得到...

牛客練習賽24 D

名字挺有意思的,排插樹,雖然這是個圖。算dijkstra的模版題,求最短路裡面最長的那條,因為到講台的距離總是取決於最短的那條路,但是又要求離講台最遠,那麼我們通過dijkstra計算出起始點到所有點的最短路然後遍歷找最大值就好。如下 include using namespace std type...