日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Luogu P4707 重返现世 (拓展Min-Max容斥、DP)

發(fā)布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Luogu P4707 重返现世 (拓展Min-Max容斥、DP) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目鏈接

https://www.luogu.org/problem/P4707

題解

最近被神仙題八連爆了……

首先Min-Max容斥肯定都能想到,問題是這題要用一個擴展版的——Kth Min-Max容斥
這個東西需要對Min-Max容斥的本質(zhì)有著比較深刻的理解。
首先我們從另一個角度證明Min-Max容斥的正確性: \(\max(S)=\sum_{T\in S}f(|T|)\min(T)\), 對于第\((x+1)\)大來說它被計算的次數(shù)是\(\sum_{k\ge 0} {x\choose k}f(k+1)\),則有\([x=0]=\sum_{k\ge 0} {x\choose k}f(k+1)\), 二項式反演之后令\(f(k)=(-1)^{k-1}\)即可達到目的。
那么考慮把剛才式子中\([x=0]\)換成\([x=k-1]\)會怎樣? 依然采取構(gòu)造系數(shù)的思路,得出的結(jié)果是: \(f[x]=(-1)^{x-k}{x-1\choose k-1}\).

問題相當于求第\(K\)大的期望,所以可以轉(zhuǎn)化成子集最小值: \(\text{kthmax}(S)=\sum_{T\in S}(-1)^{|T|-K}{|T|-1\choose k-1}\min(T)=\sum_{T\in S}\frac{m}{p_T}(-1)^{|T|-K}{|T|-1\choose k-1}\), 其中\(p_T=\sum_{i\in T} p_i\)
這個東西可以用一個dp來搞: 設(shè)\(dp[i][j][k]\)表示前\(i\)個數(shù)\(p\)之和為\(j\), 當組合數(shù)的下指標為\(k\)時每種方案乘以容斥系數(shù)之和。
考慮轉(zhuǎn)移: 如果第\(i\)個元素不屬于\(T\), 顯然是加上\(dp[i-1][j][k]\); 如果屬于\(T\), 那么要求的組合數(shù)\({|T|-1\choose k-1}={|T|-2\choose k-1}+{|T|-2\choose k-2}\), 對于前一項直接是\(dp[i-1][j-p_i][k]\), 對于后一項因為是從\(k-1\)轉(zhuǎn)移過來,所以要多乘個\(-1\), 最終結(jié)果是減去\((dp[i-1][j-p_i][k]-dp[i-1][j-p_i][k-1])\).
然而這個dp的邊界問題很難處理。這時我們不妨脫離實際問題,去思考一下組合數(shù)在指標為負數(shù)時的定義,直接代入可得\(dp[0][0][k]=-1 (k>0)\).
(然而感覺這種邊界設(shè)置方法并不嚴謹)

時間復(fù)雜度\(O(nm(n-k))\).

代碼

#include<cstdio> #include<cstdlib> #include<cstring> #include<cassert> #include<iostream> #define llong long long using namespace std;inline int read() {int x=0; bool f=1; char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=0;for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^'0');if(f) return x;return -x; }const int N = 1000; const int S = 1e4; const int M = 11; const int P = 998244353; llong quickpow(llong x,llong y) {llong cur = x,ret = 1ll;for(int i=0; y; i++){if(y&(1ll<<i)) {y-=(1ll<<i); ret = ret*cur%P;}cur = cur*cur%P;}return ret; } llong mulinv(llong x) {return quickpow(x,P-2);}llong a[N+3]; llong dp[S+3][M+2]; int n,m,s;int main() {scanf("%d%d%d",&n,&m,&s); m = n-m+1;for(int i=1; i<=n; i++) scanf("%lld",&a[i]);for(int i=1; i<=m; i++) dp[0][i] = P-1;for(int i=1; i<=n; i++){for(int j=s; j>=a[i]; j--){for(int k=1; k<=m; k++){dp[j][k] = (dp[j][k]+dp[j-a[i]][k-1]-dp[j-a[i]][k]+P)%P;}}}llong ans = 0ll;for(int i=1; i<=s; i++){ans = (ans+dp[i][m]*s%P*mulinv(i))%P;}printf("%lld\n",ans);return 0; }

總結(jié)

以上是生活随笔為你收集整理的Luogu P4707 重返现世 (拓展Min-Max容斥、DP)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。