CF1153F-Serval and Bonus Problem【dp,數學期望】
阿新 • • 發佈:2021-10-15
正題
題目連結:https://www.luogu.com.cn/problem/CF1153F
題目大意
在有\(n\)個區間的左右端點在\([0,l)\)範圍內隨機,求被至少\(k\)個區間覆蓋的期望長度。
\(1\leq n,k\leq 2000,1\leq l\leq 10^9\)
解題思路
長度為\(l\)上的數軸上\(2\times n\)個隨機點的話期望距離都是\(\frac{l}{2n+1}\)。
所以我們只需要考慮期望有多少個相鄰點對之間被\(k\)個區間覆蓋然後再乘上上面那個長度就行了。
然後考慮\(dp\),設\(f_{i,j}\)表示現在到第\(i\)個端點,前面有\(j\)個區間延伸過來,之後還剩\(n-j-\frac{i-j}{2}\)
然後每次轉移完加上不小於\(k\)個區間延伸到下一個的概率即可。
時間複雜度:\(O(nk)\)
code
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=4100,P=998244353; ll n,k,l,ans,inv[N],f[N][N]; signed main() { scanf("%lld%lld%lld",&n,&k,&l); inv[1]=1; for(ll i=2;i<N;i++) inv[i]=P-inv[P%i]*(P/i)%P; f[0][0]=1; for(ll i=0;i<2*n;i++){ for(ll j=0;j<=min(i,n);j++){ if((i-j)&1)continue; ll w=n-j-(i-j)/2; if(j)(f[i+1][j-1]+=f[i][j]*j%P*inv[w*2+j]%P)%=P; (f[i+1][j+1]+=f[i][j]*w*2ll%P*inv[w*2+j]%P)%=P; } for(ll j=k;j<=min(i,n);j++) (ans+=f[i][j])%=P; } for(ll j=k;j<=n;j++) (ans+=f[2*n][j])%=P; printf("%lld\n",ans*l%P*inv[2*n+1]%P); return 0; }