题目:http://codeforces.com/problemset/problem/543/D

题意:给你一棵树,一开始边都是0,可以使任意的边变成1,对于每一个根节点求使得它到其他任一点的路径上只有一条0边的方案数。

假设只求一个根,f[u]=∏(s[v]+1)

然后移动根节点这样就可以通过遍历一遍树得到所有点的答案了。

s[v]=(s[u]/(s[v]+1)+1)*s[v] 这样当前根和根的其他子树就变成v的子树了(前面那坨就是它的贡献。。

(看起来是这样没错。。但是不能求逆元。因为s[u]可能为0 。。所以维护前缀和后缀bfs一遍就好了。。

#include<cstring>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<map>
#define rep(i,l,r) for (int i=l;i<=r;i++)
#define down(i,l,r) for (int i=l;i>=r;i--)
#define clr(x,y) memset(x,y,sizeof(x))
#define maxn 200500
#define maxk 69
#define inf 0x7fffffff
#define ll long long
#define mm 1000000007
using namespace std;
struct data{int obj,pre;
}e[maxn*];
ll g[maxn],s[maxn],ans[maxn],pr[maxn],sc[maxn];
int head[maxn],a[maxn],vis[maxn],n,tot;
int read(){
ll x=,f=; char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-; ch=getchar();}
while (isdigit(ch)){x=x*+ch-''; ch=getchar();}
return x*f;
}
void insert(int x,int y){
e[++tot].obj=y; e[tot].pre=head[x]; head[x]=tot;
}
ll ni(ll x){
ll y=mm-,ans=;
while (y){
if (y&) ans=ans*x%mm;
x=x*x%mm;
y>>=;
}
return ans;
}
ll dfs(int u,int f){
s[u]=;
for (int j=head[u];j;j=e[j].pre){
int v=e[j].obj;
if (v==f) continue;
s[u]=s[u]*(dfs(v,u)+1LL)%mm;
}
return s[u];
}
void go(){
g[]=;
queue<int> q; clr(vis,); q.push();
while (!q.empty()){
int u=q.front(); q.pop(); vis[u]=;
int sum=;
for (int j=head[u];j;j=e[j].pre){
int v=e[j].obj;
if (!vis[v]) a[++sum]=v;
}
sort(a+,a++sum);
pr[]=; rep(i,,sum) pr[i]=pr[i-]*(s[a[i]]+)%mm;
sc[sum+]=g[u]; down(i,sum,) sc[i]=sc[i+]*(s[a[i]]+)%mm;
rep(i,,sum) {
s[a[i]]=(pr[i-]*sc[i+]%mm+)%mm*s[a[i]]%mm;
g[a[i]]=(pr[i-]*sc[i+]%mm+)%mm;
q.push(a[i]);
}
}
}
int main(){
n=read();
rep(i,,n) {
int x=read(); insert(x,i); insert(i,x);
}
dfs(,);
go();
rep(i,,n-) printf("%lld ",s[i]%mm); printf("%lld\n",s[n]%mm);
return ;
}

CodeForces 543D:Road Improvement的更多相关文章

  1. VK Cup 2016 - Qualification Round 2 C. Road Improvement dfs

    C. Road Improvement 题目连接: http://www.codeforces.com/contest/638/problem/C Description In Berland the ...

  2. Codeforces 543D. Road Improvement (树dp + 乘法逆元)

    题目链接:http://codeforces.com/contest/543/problem/D 给你一棵树,初始所有的边都是坏的,要你修复若干边.指定一个root,所有的点到root最多只有一个坏边 ...

  3. Codeforces 543D Road Improvement

    http://codeforces.com/contest/543/problem/D 题意: 给定n个点的树 问: 一开始全是黑边,对于以i为根时,把树边白染色,使得任意点走到根的路径上不超过一条黑 ...

  4. Codeforces 543D Road Improvement(树形DP + 乘法逆元)

    题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和H ...

  5. CodeForces 543D 树形DP Road Improvement

    题意: 有一颗树,每条边是好边或者是坏边,对于一个节点为x,如果任意一个点到x的路径上的坏边不超过1条,那么这样的方案是合法的,求所有合法的方案数. 对于n个所有可能的x,输出n个答案. 分析: 题解 ...

  6. Codeforces 543D Road Improvement(DP)

    题目链接 Solution 比较明显的树形DP模型. 首先可以先用一次DFS求出以1为根时,sum[i](以i为子树的根时,满足要求的子树的个数). 考虑将根从i变换到它的儿子j时,sum[i]产生的 ...

  7. Codeforces Round #302 (Div. 1) D - Road Improvement 树形dp

    D - Road Improvemen 思路:0没有逆元!!!! 不能直接除,要求前缀积和后缀积!!! #include<bits/stdc++.h> #define LL long lo ...

  8. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  9. CodeForces 696A:Lorenzo Von Matterhorn(map的用法)

    http://codeforces.com/contest/697/problem/C C. Lorenzo Von Matterhorn time limit per test 1 second m ...

随机推荐

  1. 二叉树Bynary_Tree(2):二叉树的递归遍历

    7/18/2017 正在码,理解完就写博 7/21/2017 终于码完,借助链表实现的队列撸一个二叉树对于我来说有难度,撸了两天没有成果,我最后选用的是数组实现的循环队列去撸一个二叉树 正文如下: 以 ...

  2. [array] leetcode - 33. Search in Rotated Sorted Array - Medium

    leetcode - 33. Search in Rotated Sorted Array - Medium descrition Suppose an array sorted in ascendi ...

  3. Ubuntu14.04下安装 boost (boost_1.54 最简单的方法)

    直接执行命令: sudo apt-get  install libboost-dev 测试: 创建一个 boost_test.cpp 文件,写入 #include<iostream> #i ...

  4. (一)基于阿里云的MQTT远程控制(Android 连接MQTT服务器,ESP8266连接MQTT服务器实现远程通信控制----简单的连接通信)

    如果不了解MQTT的可以看这篇文章  http://www.cnblogs.com/yangfengwu/p/7764667.html http://www.cnblogs.com/yangfengw ...

  5. 开启tomcat的apr模式,并利用redis做tomcat7的session的共享。

    更新系统组件 yum -y install readline* xmlto kernel-devel yum* screen vim* psmisc wget lrzsz pcre-devel lib ...

  6. ecsmart的开发经历

    ecsmart是ecshop的产品之一,是2015年发布的一套系统.关于它的介绍请到官网去了解,也可以百度 “商之翼” “ecsmart” 1.ecsmart分别在pc.mobile.app三个方面都 ...

  7. Delete 命令详解

    cp:复制文件 /cp -r:复制目录  /bin/cp -f: 复制文件并覆盖已有文件(写命令的绝对路径/bin/)  /cp /ect/passwd .:将其他文件复制到当前目录  /-n :不要 ...

  8. c#发展前景

    根据育龙网资料评价显示:C#几乎集中了所有关于软件开发和软件工程研究的最新成果:面向对象.类型安全.组件技术.自动内存管理.跨平台异常处理.版本控制.代码安全管理…….尽管像很多人注意到的一样,罗列上 ...

  9. java 异常处理与返回

    try{ // 1. return ++x; }catch(){ }finally{ //2. x++; } 实际返回值还是 ++x后的结果,因为 ++x 后 x 的值会入栈,作为返回结果: 以上代码 ...

  10. HMM Viterbi算法 详解

    HMM:隐式马尔可夫链   HMM的典型介绍就是这个模型是一个五元组: 观测序列(observations):实际观测到的现象序列 隐含状态(states):所有的可能的隐含状态 初始概率(start ...