直接换根dp

f[i]表示,i为根的子树的方案

f[i]=Π(f[son]+1)(就是考虑这个边修不修(不修,子树中只有一种方案))

这里是乘法

换根的时候,直接算的话,为了消除x对fa的贡献,要乘上逆元

但是

1.会TLE

2.可能f[x]+1=1e9+7,也就是没有逆元(除以0是非法的)

所以考虑用x前面的兄弟的答案和后面兄弟答案(两个连乘积)拼凑

(不用每个点开一个vector记录儿子,直接每个x开一个数记录关于father的前后兄弟答案即可)

换根的时候,把fa的贡献随便作为x儿子y的前面兄弟或者后面兄弟即可

代码:

#include<bits/stdc++.h>
#define il inline
#define reg register int
#define numb (ch^'0')
#define int long long
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=1e6+;
const int mod=1e9+;
int n;
struct node{
int nxt,to;
}e[*N];
int hd[N],cnt;
void add(int x,int y){
e[++cnt].nxt=hd[x];
e[cnt].to=y;
hd[x]=cnt;
}
int f[N];
int ple[N],pri[N];
int ans[N];
int mo(int x){
//return x>=mod?x-mod:x;
return x%mod;
}
int sta[N],top;
void dfs(int x,int fa){
f[x]=;
int st=top;
ll tmp=;
ple[x]=;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa) continue;
dfs(y,x);
sta[++top]=y;
ple[y]=f[x];
f[x]=(ll)f[x]*(f[y]+)%mod;
}
pri[x]=;
for(reg i=top;i>=st+;--i){
pri[sta[i]]=tmp;
tmp=(ll)tmp*(f[sta[i]]+)%mod;
}
top=st;
}
void sol(int x,int fa){
if(x!=){
ll nle=;
//cout<<" x "<<x<<" : "<<f[x]<<" ple "<<ple[x]<<" pri "<<pri[x]<<endl;
f[x]=(ll)f[x]*((ll)ple[x]*pri[x]%mod+)%mod;
ans[x]=f[x];
nle=((ll)ple[x]*pri[x]%mod+)%mod;
//cout<<" x "<<x<<" : "<<nle<<endl;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa) continue;
ple[y]=(ll)ple[y]*nle%mod;
sol(y,x);
}
}
else{
ll nle=;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa) continue;
sol(y,x);
}
}
}
int main(){
rd(n);
int y;
for(reg i=;i<=n;++i){
rd(y);add(i,y);add(y,i);
}
dfs(,);
ans[]=f[];
sol(,);
for(reg i=;i<=n;++i){
printf("%lld ",ans[i]);
}
return ;
} }
signed main(){
freopen("2.in","r",stdin);
freopen("2.out","w",stdout);
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/2/9 10:35:35
*/

换根的时候往往可能会除以0

要警惕!

前后兄弟处理无疑是最好的方法。

fzyzojP2291 -- 小添添的庄园之道路修复的更多相关文章

  1. 个人博客作业-week5-敏捷开发方法读后感

    满篇英文对一个非单词狂魔来说真的是很吃力啊… 敏捷软件开发方法是一种从1990年代开始逐渐引起广发关注的一些新型软件开发方法,是一种应对快速变化的需求的一种软件开发能力,他们的具体名称.理念.过程.术 ...

  2. 【干货分享】大话团队的GIT分支策略进化史

    封面 作为一名85后的技术男,一转眼10年过去了(一不小心暴露了年龄,虽然我叫18岁fantasy),亲手写代码已经是5年前了,目前主要负责公司的软件产品的规划和设计(所以最近写的东西也主要与设计和产 ...

  3. 【软件工程】Word frequency program

    一.开始写代码前的规划: 1.尝试用C#来写,之前没有学过C#,对于C++也不熟,所以打算先花1天的时间学习C# 2.整个程序基本分为文件遍历.单词提取.单词匹配.排序.输出几个模块,各个模块大致时间 ...

  4. Spring boot参考指南

    介绍 转载自:https://www.gitbook.com/book/qbgbook/spring-boot-reference-guide-zh/details 带目录浏览地址:http://ww ...

  5. 汉诺塔(思维、DP思想)

    链接:https://ac.nowcoder.com/acm/contest/3007/C来源:牛客网 题目描述 现在你有 N 块矩形木板,第 i 块木板的尺寸是 Xi*Yi,你想用这些木板来玩汉诺塔 ...

  6. Diary -「NOI 2021」酱油记

    雨幕浓稠 远近一白 是水雾弥漫的天 还是泡沫撑起的海   雨真大呢.   前几天去 ZH 中学集训没啥好记的,就从会合日开始叭. [Day -1]   逃出 ZH,掉入梦麟.(   高中的同学们忘记带 ...

  7. OO第二次博客作业—17373247

    OO第二次博客作业 零.写在前面 OO第二单元宣告结束,在这个单元里自己算是真正对面向对象编程产生了比较深刻的理解,也认识到了一个合理的架构为编程带来的极大的便利. (挂三次评测分数 看出得分接近等差 ...

  8. [蓝点zigBee] CC2530 实用教程总览

    Zstack 单个模块实验(无数据通信) 1Zstack精简,增加串口数据 Zstack 里面工程较多,整体代码量很大,若入门只需要先之关注其中的一个工程,在这个工程里添添补补逐步学习. 这一节主要是 ...

  9. 统计学习方法c++实现之八 EM算法与高斯混合模型

    EM算法与高斯混合模型 前言 EM算法是一种用于含有隐变量的概率模型参数的极大似然估计的迭代算法.如果给定的概率模型的变量都是可观测变量,那么给定观测数据后,就可以根据极大似然估计来求出模型的参数,比 ...

随机推荐

  1. Streamr助你掌控自己的数据(3)——教你在Streamr市场上发布数据

    博客说明 所有刊发内容均可转载但是需要注明出处. 教你在Streamr市场上发布数据 本系列文档主要介绍怎么通过Streamr管理自己的DATA,整个系列包括三篇教程文档,分别是:教你5分钟上传数据至 ...

  2. eos源码编译

    编译源码 运行代码 在阿里云 纽约服务器上运行没有出现任何问题. 在其他电脑上出现很多问题. 搜集到的问题如下: 随着EOSIO软件越来越成熟,后来的开发者也越来越幸福.EOS相关源码的编译和运行变得 ...

  3. html , body , margin , overflow 之大乱战

    <!DOCTYPE html> <html> <head> <style> html,body{ margin:0 ;padding:0 } div{m ...

  4. 随手记录-linux-常用命令

    转自:https://www.cnblogs.com/yjd_hycf_space/p/7730690.html linux目录结构:http://www.cnblogs.com/fat39/p/72 ...

  5. 利用Cocoapods创建基于SVN的私有库podspec

    由于项目年后要进行组件化,考虑到公司内部实现的一些私有组件,不对外公开,而又想在不同项目中使用,该怎么办呢?由于cocoapods有了强大的功能,可以自己创建podspec,更可以设置私有的库.那么利 ...

  6. 关于手机端h5上传图片配合exif.min.js,processImg.js的使用

    首先这里有个new FileReader()的概念,这是h5新增的,用来把文件读入内存,并且读取文件中的数据.FileReader接口提供了一个异步API,使用该API可以在浏览器主线程中异步访问文件 ...

  7. 第九次作业psp

    psp 进度条 代码累积折线图 博文累积折线图 psp饼状图

  8. pycharm 2017注册码

    1.在浏览器的地址栏输入:http://idea.lanyus.com/,该网址,无需修改用户名,点击获取注册码.复制该注册码,粘贴在注册界面的Activation code的输入框中,点击 ok 该 ...

  9. 学习率(Learning rate)的理解以及如何调整学习率

    1. 什么是学习率(Learning rate)?   学习率(Learning rate)作为监督学习以及深度学习中重要的超参,其决定着目标函数能否收敛到局部最小值以及何时收敛到最小值.合适的学习率 ...

  10. TCP系列53—拥塞控制—16、Destination Metrics和Congestion Manager

    一.概述 我们之前介绍过rtt.ssthresh等变量,这些变量一般在TCP连接建立的时候有个初始值,然后随着TCP的数据交互逐渐调整到适应对应的网络状态的值.但是如果每次TCP建立连接都依靠默认初始 ...