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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

AGC056E-Cheese【dp】

發布時間:2023/12/3 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AGC056E-Cheese【dp】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

奶酪可能會長腿,但絕對不會變質
_ _,_ _ _ _ _ _ _


正題

題目鏈接:https://atcoder.jp/contests/agc056/tasks/agc056_e


題目大意

有一個長度為nnn的環,第i+0.5(0≤i<n)i+0.5(0\leq i<n)i+0.5(0i<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=1001n50,i=0n?1?ai?=100


解題思路

考慮第nnn只老鼠留到最后的概率,因為無論是哪只奶酪吃什么老鼠都是一樣的,所以我們可以考慮開始時就將所有的奶酪放下來,然后讓它們一起繞著環走。

同樣的,奶酪的移動順序也是無關緊要的,所以我們可以考慮讓所有的奶酪先繞道第nnn只老鼠的面前然后一起統計。

那么先考慮dpdpdp,設fi,j,kf_{i,j,k}fi,j,k?表示現在已經放下的奶酪都已經走到了位置iii處,然后已經放下了jjj個奶酪,已經有kkk個被老鼠吃了。

那么每次的轉移分成兩部分,第一部分是放奶酪,枚舉這個位置放置了xxx個奶酪,需要注意的是除了概率以外因為這個方案是涉及可重排列的,所以還需要乘上一個1x!\frac{1}{x!}x!1?。

第二部分是吃奶酪,因為每只奶酪只會吃一個老鼠,所以統計沒有這些奶酪都沒有被吃的概率,很方便轉移。

那么假設目前有kkk個奶酪走到了第nnn只老鼠前,那么說明前面還剩下k?1k-1k?1只老鼠沒有被吃,那么考慮這種情況下第nnn只老鼠被留到最后的概率。

考慮一個神必的證明方法,我們考慮繞一圈繞到第iii只老鼠處還剩下xxx個奶酪,然后考慮iiii+1i+1i+1之間被留到最后的概率:

  • 如果iiii+1i+1i+1都吃到了,我們顯然得不出兩個的概率關系。
  • 如果iiii+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=1i=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?就好了。

時間復雜度: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; }

總結

以上是生活随笔為你收集整理的AGC056E-Cheese【dp】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。