新网站建设信息,天津建设工程信息网网页版,代码给wordpress添加图片不显示,怎么开通自己的微信公众号前言
话说在LojLojLoj下了个数据发现这题的名字叫fgofgofgo 正题
题目链接:https://www.luogu.com.cn/problem/P5405 题目大意 nnn张卡的权值为1/2/31/2/31/2/3的概率权重分别是px,1/2/3p_{x,1/2/3}px,1/2/3#xff0c;然后按照权值每次获得一张未获得的卡#xff0c;然后…前言
话说在LojLojLoj下了个数据发现这题的名字叫fgofgofgo 正题
题目链接:https://www.luogu.com.cn/problem/P5405 题目大意
nnn张卡的权值为1/2/31/2/31/2/3的概率权重分别是px,1/2/3p_{x,1/2/3}px,1/2/3然后按照权值每次获得一张未获得的卡然后再该出一棵有向树方向可以都是外向或内向的求所有每条边(u,v)(u,v)(u,v)uuu都比vvv先获得的概率。
1≤n≤1000,0≤pi,j≤1061\leq n\leq 1000,0\leq p_{i,j}\leq 10^61≤n≤1000,0≤pi,j≤106 解题思路
只考虑外向树的话就是水题了因为显然的xxx要排在子树最前面的概率就是wx∑y∈subtreexwy\frac{w_x}{\sum_{y\in subtree_x}w_y}∑y∈subtreexwywx。
然后直接n2n^2n2的dpdpdp就可以力。
但是现在有内向边怎么办还是考虑转换成只有外向的也就是去掉一种限制。
去掉一种限制的话容斥是一个不错的办法考虑的话就是恰好若干条指定边内向边我们可以指定至少kkk跳内向边不满足条件这样就组成了一个外向森林可以很容易处理出答案而且这样的容斥系数就是(−1)k(-1)^k(−1)k。
然后直接dpdpdp就得了设fi,jf_{i,j}fi,j表示到节点iii然后权值和是jjj如果限制一条内向边就直接乘上一个−1-1−1就好了。
额这种树形dpdpdp枚举子树大小可以做到n2n^2n2这个是老生常谈了
时间复杂度O(n2)O(n^2)O(n2) code
#includecstdio
#includecstring
#includealgorithm
#define ll long long
using namespace std;
const ll N1100,P998244353;
struct node{ll to,next,w;
}a[N1];
ll n,tot,ans,ls[N],siz[N],w[N][3],f[N][3*N],g[N*3];
ll power(ll x,ll b){ll ans1;while(b){if(b1)ansans*x%P;xx*x%P;b1; }return ans;
}
void addl(ll x,ll y,ll w){a[tot].toy;a[tot].nextls[x];a[tot].ww;ls[x]tot;return;
}
void dp(ll x,ll fa){ll dpower(w[x][0]w[x][1]w[x][2],P-2);siz[x]3;f[x][1]w[x][0]*d%P;f[x][2]w[x][1]*d*2ll%P;f[x][3]w[x][2]*d*3ll%P;for(ll els[x];e;ea[e].next){ll ya[e].to;if(yfa)continue;dp(y,x);if(a[e].w){for(ll i1;isiz[x];i)for(ll j1;jsiz[y];j)(g[ij]-f[x][i]*f[y][j]%P)%P,(g[i]f[x][i]*f[y][j]%P)%P;}else{for(ll i1;isiz[x];i)for(ll j1;jsiz[y];j)(g[ij]f[x][i]*f[y][j]%P)%P;}siz[x]siz[y];for(ll i1;isiz[x];i)f[x][i]g[i],g[i]0;}for(int i1;isiz[x];i)f[x][i]f[x][i]*power(i,P-2)%P;return;
}
signed main()
{scanf(%lld,n);for(ll i1;in;i)scanf(%lld%lld%lld,w[i][0],w[i][1],w[i][2]);for(ll i1;in;i){ll x,y;scanf(%lld%lld,x,y);addl(x,y,0);addl(y,x,1);}dp(1,0);for(ll i1;isiz[1];i)(ansf[1][i])%P;printf(%lld\n,(ansP)%P);return 0;
}