AGC056E-Cheese【dp】
前言
奶酪可能會長腿,但絕對不會變質(zhì)
_ _,_ _ _ _ _ _ _
正題
題目鏈接:https://atcoder.jp/contests/agc056/tasks/agc056_e
題目大意
有一個長度為nnn的環(huán),第i+0.5(0≤i<n)i+0.5(0\leq i<n)i+0.5(0≤i<n)位置上各有一只老鼠。
然后進行以下操作n?1n-1n?1次:
第iii個位置有ai%a_i\%ai?%的概率被選擇(選擇一個),然后在這個位置上放一個奶酪,這個奶酪會順時針跑,跑到一個老鼠的位置時有50%50\%50%的概率被吃掉,老鼠如果吃過奶酪就會離開。
求每只老鼠被留到最后的概率。
1≤n≤50,∑i=0n?1ai=1001\leq n\leq 50,\sum_{i=0}^{n-1}a_i=1001≤n≤50,∑i=0n?1?ai?=100
解題思路
考慮第nnn只老鼠留到最后的概率,因為無論是哪只奶酪吃什么老鼠都是一樣的,所以我們可以考慮開始時就將所有的奶酪放下來,然后讓它們一起繞著環(huán)走。
同樣的,奶酪的移動順序也是無關(guān)緊要的,所以我們可以考慮讓所有的奶酪先繞道第nnn只老鼠的面前然后一起統(tǒng)計。
那么先考慮dpdpdp,設(shè)fi,j,kf_{i,j,k}fi,j,k?表示現(xiàn)在已經(jīng)放下的奶酪都已經(jīng)走到了位置iii處,然后已經(jīng)放下了jjj個奶酪,已經(jīng)有kkk個被老鼠吃了。
那么每次的轉(zhuǎn)移分成兩部分,第一部分是放奶酪,枚舉這個位置放置了xxx個奶酪,需要注意的是除了概率以外因為這個方案是涉及可重排列的,所以還需要乘上一個1x!\frac{1}{x!}x!1?。
第二部分是吃奶酪,因為每只奶酪只會吃一個老鼠,所以統(tǒng)計沒有這些奶酪都沒有被吃的概率,很方便轉(zhuǎn)移。
那么假設(shè)目前有kkk個奶酪走到了第nnn只老鼠前,那么說明前面還剩下k?1k-1k?1只老鼠沒有被吃,那么考慮這種情況下第nnn只老鼠被留到最后的概率。
考慮一個神必的證明方法,我們考慮繞一圈繞到第iii只老鼠處還剩下xxx個奶酪,然后考慮iii和i+1i+1i+1之間被留到最后的概率:
- 如果iii和i+1i+1i+1都吃到了,我們顯然得不出兩個的概率關(guān)系。
- 如果iii和i+1i+1i+1都沒被吃到,我們也得不出來,考慮下一輪。
- 如果iii吃了并且i+1i+1i+1沒吃,概率是(1?12x)12x?1(1-\frac{1}{2^x})\frac{1}{2^{x-1}}(1?2x1?)2x?11?
- 如果iii沒吃并且i+1i+1i+1吃了,概率是12x(1?12x)\frac{1}{2^x}(1-\frac{1}{2^x})2x1?(1?2x1?)
那么記pip_ipi?表示iii留到最后的概率,就有pi:pi+1=12x(1?12x):(1?12x)12x?1=1:2p_i:p_{i+1}=\frac{1}{2^x}(1-\frac{1}{2^x}):(1-\frac{1}{2^x})\frac{1}{2^{x-1}}=1:2pi?:pi+1?=2x1?(1?2x1?):(1?2x1?)2x?11?=1:2
然后又因為∑i=1k?1pi=1\sum_{i=1}^{k-1}p_i=1∑i=1k?1?pi?=1,所以有pi=2i?12k?1p_i=\frac{2^{i-1}}{2^{k}-1}pi?=2k?12i?1?,那么我們要求的就是p1=12k?1p_1=\frac{1}{2^k-1}p1?=2k?11?
然后這樣是求第nnn只老鼠的,改一下其他的aia_iai?就好了。
時間復(fù)雜度:O(n5)O(n^5)O(n5)
code
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=55,P=998244353; ll n,fac[N],inv[N],pw[N],pr[N]; ll a[N],f[N][N][N]; ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans; } signed main() {scanf("%lld",&n);fac[0]=inv[0]=inv[1]=pw[0]=pr[0]=1;for(ll i=2;i<N;i++)inv[i]=P-inv[P%i]*(P/i)%P;for(ll i=1;i<N;i++)fac[i]=fac[i-1]*i%P,inv[i]=inv[i-1]*inv[i]%P;for(ll i=1;i<N;i++)pw[i]=pw[i-1]*inv[2]%P,pr[i]=pr[i-1]*2ll%P;for(ll i=0;i<n;i++)scanf("%lld",&a[i]),a[i]=a[i]*power(100,P-2)%P;ll sum=0;for(ll s=0;s<n;s++){//f[i][j][k]表示到s+i,j個奶酪,被吃了k個memset(f,0,sizeof(f));f[0][0][0]=1;for(ll x=1;x<=n;x++){for(ll i=0;i<n;i++)for(ll j=0;j<=i;j++)for(ll k=0,r=1;k<=i-j;k++,r=r*a[(s+x)%n]%P)(f[x][i][j]+=f[x-1][i-k][j]*r%P*inv[k]%P)%=P;if(x==n)continue;for(ll i=0;i<n;i++)for(ll j=i-1;j>=0;j--){(f[x][i][j+1]+=f[x][i][j]*(1-pw[i-j])%P)%=P;(f[x][i][j]=f[x][i][j]*pw[i-j]%P)%=P;}}ll ans=0;for(ll i=1;i<=n;i++)(ans+=f[n][n-1][n-i]*fac[n-1]%P*power(pr[i]-1,P-2)%P)%=P;printf("%lld ",(ans+P)%P);sum=(sum+ans)%P;}return 0; }總結(jié)
以上是生活随笔為你收集整理的AGC056E-Cheese【dp】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 德玛西亚皇子叫什么名字
- 下一篇: 伊斯兰教的教义是什么