博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces 543D
阅读量:4672 次
发布时间:2019-06-09

本文共 1221 字,大约阅读时间需要 4 分钟。

题解:

考虑dp[u][0/1]表示u的子树中有没有坏边的方案数,

dp[u][0] = 1(显然必须全是好边)

dp[u][1] = ∏ (dp[v][0] * 2 + dp[v][1]) - 1 (-1是全是好边的情况)

然后我们考虑这个dp[u][0]并没有必要单独设出来

令f[u] = dp[u][0] + dp[u][1]

则f[u] = ∏ (1 + f[v])

显然f[1]可以求出来了

这个就是ans[1]

然后再扫一遍,记录从根到u的信息val = ans[u] / (1 + f[v])

这样ans[v] = f[u] * (val + 1)(将来自父亲的那一块也看成子树)

然后这里 /(1 + f[v])求逆元是错的

因为 1 + f[v] == mod 时就GG了

所以考虑维护前缀和、后缀和

每次乘一下就可以了

1 #include
2 #define ll long long 3 #define maxn 200005 4 using namespace std; 5 const ll mod = 1000000007; 6 int n; 7 vector
g[maxn]; 8 ll f[maxn],ans[maxn]; 9 ll fastpow(ll a,ll p)10 {11 ll res=1;12 while(p)13 {14 if(p&1)res=res*a%mod;15 a=a*a%mod;p>>=1;16 }17 return res;18 }19 ll inv(ll x)20 {21 return fastpow(x,mod-2);22 }23 void dfs(int u)24 {25 f[u]=1;26 for(int i=0;i
pre(sz+1,0),suf(sz+1,0);39 pre[0]=1,suf[sz]=1;40 for(int i=1;i<=sz;++i)41 {42 int v=g[u][i-1];43 pre[i]=pre[i-1]*(1+f[v])%mod;44 }45 for(int i=sz-1;i>=0;--i)46 {47 int v=g[u][i];48 suf[i]=suf[i+1]*(1+f[v])%mod;49 }50 for(int i=0;i
View Code

 

转载于:https://www.cnblogs.com/uuzlove/p/10514136.html

你可能感兴趣的文章
hdu 4284(状压dp)
查看>>
kafka资源
查看>>
XML Schema 配置文件自动生成c#类设计案例子
查看>>
数学公式字体样式大全
查看>>
1.pyhon入门
查看>>
解题:POI 2008 Station
查看>>
JAVA开发第一步——JDK 安装
查看>>
javascript 原生事件综合查询
查看>>
[视频]产品营销之拍出好电子产品,Peter Belanger是如何为苹果产品拍照的
查看>>
PAT 1019. General Palindromic Number
查看>>
[Leetcode] Sudoku Solver
查看>>
在web项目启动时,使用监听器来执行某个方法
查看>>
前端笔试题【1】--从字符串的第二个字符开始对数组进行排序
查看>>
html 标签总结
查看>>
netstat 查看端口
查看>>
tcp关闭连接:挥手讨论
查看>>
Game HDU - 5242 树链思想
查看>>
结构模式--之--享元模式
查看>>
Solr文档
查看>>
c++文件結束符
查看>>