[树形DP] 51Nod1500 苹果曼和树
来源:互联网 发布:乐其网络 编辑:程序博客网 时间:2024/06/05 05:28
简单的树形
转移很显然。
#include<cstdio>#include<algorithm>using namespace std;typedef long long LL;const int maxn=100005,maxe=100005,MOD=1000000007;int n,c[maxn];LL f[maxn][2];int fir[maxn],nxt[maxe],son[maxe],tot;void add(int x,int y){ son[++tot]=y; nxt[tot]=fir[x]; fir[x]=tot;}LL Pow(LL a,int b){ LL res=1; a%=MOD; for(;b;b>>=1,a=a*a%MOD) if(b&1) res=(res*a)%MOD; return res;}void dfs(int x){ LL all0=1; for(int j=fir[x];j;j=nxt[j]) dfs(son[j]), (all0*=(f[son[j]][0]+f[son[j]][1])%MOD)%=MOD; if(c[x]) f[x][1]=all0, f[x][0]=0; else{ f[x][0]=all0; for(int j=fir[x];j;j=nxt[j]) (f[x][1]+=all0*Pow(f[son[j]][0]+f[son[j]][1],MOD-2)%MOD*f[son[j]][1]%MOD)%=MOD; }}int main(){ freopen("51nod1500.in","r",stdin); freopen("51nod1500.out","w",stdout); scanf("%d",&n); for(int i=2;i<=n;i++){ int x; scanf("%d",&x); add(x+1,i); } for(int i=1;i<=n;i++) scanf("%d",&c[i]); dfs(1); printf("%d\n",f[1][1]); return 0;}
阅读全文
0 0
- [树形DP] 51Nod1500 苹果曼和树
- 【51Nod1500】苹果曼和树
- 51nod 苹果曼和树 (树形dp)
- 51nod 1500 苹果曼和树(树形dp)
- 51 nod 1500 苹果曼和树(树形DP)
- 【树形DP】51Nod 1500 苹果曼和树
- 51nod 1500 苹果曼和树【树形DP】
- 51nod 1500 苹果曼和树 树形DP
- [树形DP]51 Nod 1500——苹果曼和树
- 树形dp ural1018苹果二叉树
- poj 2486 树形dp(吃苹果)
- BZOJ 2645 陶陶吃苹果 [树形DP]
- 51nod 1424 零树(树形dp)
- 【51Nod1588】幸运树(树形DP)
- 51nod1405(树形dp)
- bzoj 2645: Vijos1676 陶陶吃苹果 (树形DP)
- 树形dp 和 状态压缩dp
- 51Nod-1500-苹果曼和树
- Linux中可执行文件
- 笔记网站
- idea tomcat plugins error
- python3 爬虫基础(一本书推荐)
- tomcat调试模式出问题的解决方法
- [树形DP] 51Nod1500 苹果曼和树
- httpclient模拟浏览器下载文件-常用方法集锦
- 函数的简单介绍
- 高精度模板---加、减、乘(非负数)
- 问题收集篇-Http访问域名的解析流程
- Eclipse中使用SVN
- 到底什么是用户体验?
- 第七周 项目一 【顺序环形队列】
- 学习SSM框架笔记五:利用五大组件采取配置文件和SpringMVC模式写HelloWorld