考虑外向树怎么做。显然设f[i][j]为i子树中出现权值和为j的合法方案的概率,转移做树形背包即可。

  如果树上只有一条反向边,显然可以先不考虑该边计算概率,再减去将整棵树看做外向树的概率。于是考虑容斥,进一步拓展到多条反向边,就是考虑0条反向边的概率-考虑1条反向边的概率+考虑2条反向边的概率……容斥可以在dp中完成,即遇到反向边时分是否考虑它转移,若考虑乘上-1的系数。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 3010
#define P 998244353
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
int n,a[N][4],p[N],size[N],I[N],ans,t;
int d[N][N],f[N][N],h[N];
bool flag[N];
int ksm(int a,int k)
{int s=1;for (;k;k>>=1,a=1ll*a*a%P) if (k&1) s=1ll*s*a%P;return s;
}
int inv(int a){return ksm(a,P-2);}
void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
struct data{int x,y,op;
}e[N];
struct data2{int to,nxt,op;
}edge[N];
void addedge(int x,int y,int op){t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].op=op,p[x]=t;}
void dfs(int k)
{flag[k]=1;for (int i=1;i<=n;i++)if (d[k][i]&&!flag[i]) d[k][i]=d[i][k]=k,dfs(i);
}
void dp(int k)
{f[k][0]=1;for (int i=p[k];i;i=edge[i].nxt){dp(edge[i].to);for (int x=size[k];x>=0;x--) h[x]=f[k][x];for (int x=0;x<=size[k]+size[edge[i].to];x++) f[k][x]=0;if (edge[i].op==0){for (int x=size[k];x>=0;x--)for (int y=size[edge[i].to];y>=0;y--)inc(f[k][x+y],1ll*h[x]*f[edge[i].to][y]%P);}else{for (int x=size[k];x>=0;x--)for (int y=size[edge[i].to];y>=0;y--)inc(f[k][x+y],1ll*(P-1)*h[x]%P*f[edge[i].to][y]%P),inc(f[k][x],1ll*h[x]*f[edge[i].to][y]%P);}size[k]+=size[edge[i].to];}for (int x=size[k];x>=0;x--) h[x]=f[k][x];for (int x=0;x<=size[k]+3;x++) f[k][x]=0;for (int x=size[k];x>=0;x--)for (int y=3;y>=1;y--)inc(f[k][x+y],1ll*h[x]*a[k][y]%P*y*I[x+y]%P);size[k]+=3;
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);const char LL[]="%I64d\n";
#elseconst char LL[]="%lld\n";
#endifn=read();for (int i=1;i<=n;i++){for (int j=1;j<=3;j++) a[i][j]=read();int p=inv(a[i][1]+a[i][2]+a[i][3]);for (int j=1;j<=3;j++) a[i][j]=1ll*a[i][j]*p%P;}for (int i=1;i<n;i++) e[i].x=read(),e[i].y=read(),d[e[i].x][e[i].y]=d[e[i].y][e[i].x]=1;dfs(1);for (int i=1;i<n;i++){if (d[e[i].x][e[i].y]==e[i].y) swap(e[i].x,e[i].y),e[i].op=1;addedge(e[i].x,e[i].y,e[i].op);}for (int i=1;i<=n*3;i++) I[i]=inv(i);dp(1);for (int i=0;i<=3*n;i++) inc(ans,f[1][i]);cout<<ans;return 0;
} 

  

转载于:https://www.cnblogs.com/Gloid/p/10907852.html

Luogu5405 CTS2019氪金手游(容斥原理+树形dp)相关推荐

  1. LOJ 3124 「CTS2019 | CTSC2019」氪金手游——概率+树形DP

    题目:https://loj.ac/problem/3124 看了题解:https://www.cnblogs.com/Itst/p/10883880.html 先考虑外向树. 考虑分母是 \( \s ...

  2. [LOJ#3119][Luogu5405][CTS2019]氪金手游(DP+容斥)

    先考虑外向树的做法,显然一个点在其子树内第一个出现的概率等于它的权值除以它子树的权值和.于是f[i][j]表示i的子树的权值和为j时,i子树内所有数的相互顺序都满足条件的概率,转移直接做一个背包卷积即 ...

  3. P5405-[CTS2019]氪金手游【树形dp,容斥,数学期望】

    前言 话说在LojLojLoj下了个数据发现这题的名字叫fgofgofgo 正题 题目链接:https://www.luogu.com.cn/problem/P5405 题目大意 nnn张卡的权值为1 ...

  4. [CTS2019]氪金手游 概率Dp,树形Dp,容斥原理

    [CTS2019]氪金手游 题目传送门: luogu 分析 先考虑一下那个奇怪的条件(都知道是哪个吧) 它实际上是说,整个结构形成了一棵树. 但是这棵树很奇怪,边有顺的也有反的. 先考虑全是顺的边的情 ...

  5. P5405 [CTS2019]氪金手游 【数学概率+树形dp】

    P5405 [CTS2019]氪金手游 [数学概率+树形dp] 先考虑外向树的情况: 这个的关键是要把求满足拓扑序的概率转化为求 每个点都比它的子树中的所有节点先取到的概率 .单个节点 xxx 的概率 ...

  6. LOJ3124 CTS2019 氪金手游 概率、容斥、树形DP

    传送门 D2T3签到题可真是IQ Decrease,概率独立没想到然后就20pts滚粗了 注意题目是先对于所有点rand一个权值\(w\)然后再抽卡. 先考虑给出的关系是一棵外向树的情况.那么我们要求 ...

  7. [CTS2019]氪金手游

    https://www.luogu.org/problemnew/show/P5405 题解 首先考虑一条链的情况. \(O->O->O->O->O\) 比如说这样一条链. 每 ...

  8. [LOJ#3124][CTS2019]氪金手游(概率 + 树形 DP + 容斥)

    Address 洛谷 P5405 LOJ #3124 Solution 先考虑如果以某个点(下面定为 111 )为根时,如果所有的限制二元组 (u,v)(u,v)(u,v) 都满足 uuu 是 vvv ...

  9. [CTS2019]氪金手游(容斥+树形背包DP)

    降智好题.本蒟蒻VP时没想到怎么做被题面迷惑了,只会20分的"好"成绩.简直自闭了. 首先显然度为0的点是白给的,根据等比数列求和公式即可求得.然后考虑这个树如果是一颗外向树,就是 ...

最新文章

  1. c语言表达式3178的值为,【C语言】C语言运算符
  2. Builder (建造者) — 【面向对象设计模式学习】
  3. 分享云及人工智能的一些学习资源和学习心得
  4. java的matcher方法,Matcher 的方法
  5. [C++ STL] 常用算法总结
  6. Jquery一些常见性能的问题
  7. LeetCode 36. 有效的数独(哈希)
  8. python第八周小测验_Python语言程序设计第2周测验+练习题复盘
  9. Spring MVC遭遇checkbox的问题解决方案
  10. Linux软件万花筒
  11. 主机与虚拟机不能通信
  12. mysql 5.7 延迟同步_完全解决 MySQL 5.7 主从复制的延迟问题
  13. c语言编程题作弊技巧,全国计算机二级C语言上机编程题详细分析(1)
  14. ESP32-土壤湿度传感器
  15. python制作口算大师
  16. Android手机刷机介绍
  17. AirSim学习和踩坑记录(不定时更新)
  18. 纽扣电池常识——以CR2450为例
  19. SATA系列专题之六:浅析NCQ原生指令序列
  20. 直戳心窝的日常单品搭配指南,精致girl必看

热门文章

  1. html utf 8编码转换器,utf8和gb2312编码在线转换工具
  2. python 实现图片添加文字水印
  3. 软件测试 | 测试开发 | 黑盒测试方法论—场景法
  4. python-pandas-读取与写入文件
  5. UE4 Shader 着色器概述
  6. windows7远程桌面
  7. android拷机工具,【AndroidFramework】【EMMC拷机】混合拷机时盒子待机
  8. Java中使用JCOM操作Word/Excel对象
  9. CSS学习笔记——动画进阶(八音盒动画效果)
  10. 一个菜鸟的Geant4入门之路:alpha粒子轰击金箔的例子