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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[CTS2019]氪金手游

發布時間:2024/7/5 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [CTS2019]氪金手游 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://www.luogu.org/problemnew/show/P5405

題解

首先考慮一條鏈的情況。

\(O->O->O->O->O\)

比如說這樣一條鏈。

每個元素應當是這個元素到結尾這條子鏈中第一個被抽到的,這個概率手算一下發現它是
\[ \frac{p_i}{\sum_{j=i}^np_j} \]
所以答案其實就是所有i的積。

\(O->O<-O->O->O\)

如果出現這樣的情況怎么辦?

考慮如果把這條邊斷掉,對兩條鏈分別算答案乘起來,這樣會算出來的不合法的情況是第二個在第三個前面被抽到的情況,所以我們再減去把那條邊再反過來的答案就好了。

對于多反邊,可以想到容斥,答案為考慮0條邊的-考慮奇數條邊的+考慮偶數條邊的(這里的考慮是指反向)。

根據十二省聯考的經驗,鏈上的情況是可以推廣到樹上的。

實現的時候不需要枚舉子集,直接在樹形\(dp\)中把反邊的邊權記錄成\(-1\)就好了,

突然發現我考場好像讀錯題了。

代碼

#include<bits/stdc++.h> #define N 1009 using namespace std; typedef long long ll; const int mod=998244353; ll dp[N][N*3],g[N*3],ni[N*3],a[N][3]; int n,size[N],head[N],tot; inline ll rd(){ll x=0;char c=getchar();bool f=0;while(!isdigit(c)){if(c=='-')f=1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}return f?-x:x; } inline ll power(ll x,ll y){ll ans=1;while(y){if(y&1)ans=ans*x%mod;x=x*x%mod;y>>=1;}return ans; } struct edge{int n,to,l; }e[N<<1]; inline void add(int u,int v){e[++tot].n=head[u];e[tot].to=v;head[u]=tot;e[tot].l=1;e[++tot].n=head[v];e[tot].to=u;head[v]=tot;e[tot].l=mod-1; } inline void MOD(ll &x){x=x>=mod?x-mod:x;} inline void prework(int n){for(int i=1;i<=n;++i)ni[i]=power(i,mod-2);return; } void dfs(int u,int fa){dp[u][0]=1;for(int i=head[u];i;i=e[i].n)if(e[i].to!=fa){int v=e[i].to;dfs(v,u);memset(g,0,sizeof(g));for(int j=0;j<=size[u];++j)for(int k=0;k<=size[v];++k){MOD(g[j+k]+=dp[u][j]*dp[v][k]%mod*e[i].l%mod);if(e[i].l!=1)MOD(g[j]+=dp[u][j]*dp[v][k]%mod);}memcpy(dp[u],g,sizeof(dp[u]));size[u]+=size[v];}memset(g,0,sizeof(g));for(int i=0;i<=size[u];++i)for(int j=1;j<=3;++j){MOD(g[i+j]+=dp[u][i]*ni[i+j]%mod*j%mod*a[u][j-1]%mod);} memcpy(dp[u],g,sizeof(dp[u]));size[u]+=3; } int main(){n=rd();for(int i=1;i<=n;++i){ll s=0;a[i][0]=rd();a[i][1]=rd();a[i][2]=rd();s=power(a[i][0]+a[i][1]+a[i][2],mod-2);a[i][0]=a[i][0]*s%mod;a[i][1]=a[i][1]*s%mod;a[i][2]=a[i][2]*s%mod;}int x,y;for(int i=1;i<n;++i){x=rd();y=rd();add(x,y);}prework(3*n);dfs(1,0);ll ans=0;for(int i=1;i<=n*3;++i)MOD(ans+=dp[1][i]);cout<<ans;return 0; }

轉載于:https://www.cnblogs.com/ZH-comld/p/10910345.html

總結

以上是生活随笔為你收集整理的[CTS2019]氪金手游的全部內容,希望文章能夠幫你解決所遇到的問題。

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