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 longusing
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...