直接换根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. python 根据年月日,计算是这一年中的第几天

    利用python计算某一天是这一年中的第几天,例如,给定年份= 2019年,月份= 1,日期= 3,则返回3:因为2019-01-03日期是2019年的第3 天. 首先,我们要知道闰年.平年怎么区分: ...

  2. 笨办法学Python - 习题5: More Variables and Printing

    1.习题 5: 更多的变量和打印 学习目标:了解用户输入方法,明白pthon2和Python3之间的用户输入的区别.了解格式化字符串(format string)的概念,学会如何创建包含变量内容的字符 ...

  3. ualias命令详解

    基础命令学习目录首页 原文链接:https://blog.csdn.net/yexiangcsdn/article/details/82782667 个人分类: Linux Command 所属专栏: ...

  4. 插件使用-HighChart

    一.介绍 让数据可视化更简单,兼容 IE6+.完美支持移动端.图表类型丰富.方便快捷的 HTML5 交互性图表库. 官网(英):https://www.highcharts.com/download ...

  5. jenkins设置定时任务

    每次都手动的构建项目显然不够方便,有时候需要定时地执行自动化测试脚本.例如,每天晚上定时执行 pjenkins.py 文件来运行自动化测试项目. 设置定时任务 前面已经创建的 “python test ...

  6. IntelliJ IDEA 自动编译功能无法使用,On 'update' action:选项里面没有update classes and resources这项

    https://zhidao.baidu.com/question/1381265197230335740.html

  7. Scrum Meeting 10.22

    Scrum Meeting No.2 今天的主要任务是配置安卓开发环境,并运行上一届的项目. 主流的安卓开发环境有eclipse+ADT+SDK和android studio两种.两种环境的文件架构似 ...

  8. java第三次试验报告

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计   班级:1353       姓名:郭皓  学号:20135327 成绩:             指导 ...

  9. spring冲刺第三天

    昨天完成了环境配置和初步的地图设想. 今天从网上找了有关这方面的例子,运行试验了一番.编写的地图画面在程序上运行了一下,有些错误,还需要很多方面的改进. 这些例子有很多地方都不太懂,但还是看完了.我认 ...

  10. 2018软工实践—Beta冲刺(2)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Beta 冲鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调组内工作 修改前端界面 展示GitHub当日代码/文档签入记录(组内 ...