链接:https://ac.nowcoder.com/acm/problem/19782
题目:修修去年种下了一棵树,现在它已经有n个结点了。
        修修非常擅长数数,他很快就数出了包含每个点的连通点集的数量。
        澜澜也想知道答案,但他不会数数,于是他把问题交给了你。

思路是很简单的换根dp,先求出以1为根的值,然后进行撤回操作再换根,这里最要注意的坑点是 dp【v】+1%mod会等于0(加法会导致模等于0),所以我们这里需要特判处理。

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <cstdlib>
#define INF 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define re register
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(a) ((a)&-(a))
#define ios std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
#define fi first
#define rep(i,n) for(int i=0;(i)<(n);i++)
#define rep1(i,n) for(int i=1;(i)<=(n);i++)
#define se second
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define ac cout<<ans<<"\n"
#define F(x) ((x)/3+((x)%3==1?0:tb))
#define G(x) ((x)<tb?(x)*3+1:((x)-tb)*3+2)
using namespace std;
typedef long long  ll;
typedef unsigned long long  ull;
typedef pair<ll,ll> pii;
int dx[4]= {-1,1,0,0},dy[4]= {0,0,1,-1};
const ll mod=1e9+7;
const ll N =1e6+10;
const double eps = 1e-4;
//const double pi=acos(-1);
ll qk(ll a,ll b){ll ans=1;while(b){if(b&1) ans=(ans*a)%mod;a=(a*a)%mod;b/=2;}return ans%mod;
}
int n;
ll dp[N];
vector<int> g[N];
ll w[N],f[N];
void dfs(int u,int f){dp[u]=1;for(int v:g[u]){if(v==f) continue;dfs(v,u);dp[u]=(dp[u]*((dp[v]+1ll)%mod))%mod;}
}
void DP(int u,int p){for(int v:g[u]){if(v==p) continue;if((dp[v]+1)%mod==0){if(p) f[v]=f[u]+1;else f[v]=1;for(int k:g[u]){if(k==v||k==p) continue;f[v]=(f[v]*(dp[k]+1)%mod)%mod;}}else f[v]=(w[u]*qk(dp[v]+1ll,mod-2))%mod;w[v]=(dp[v]*((f[v]+1ll)%mod))%mod;DP(v,u);}
}
void sovle(){cin>>n;for(int i=2;i<=n;i++){int u,v;cin>>u>>v;g[u].push_back(v);g[v].push_back(u);}dfs(1,0);w[1]=dp[1];DP(1,0);for(int i=1;i<=n;i++) cout<<w[i]<<endl;
}
int main()
{
#ifdef LOCALfreopen("in.txt", "r", stdin);
#elseint t=1;//cin>>t;while(t--) sovle();
#endif // LOCALreturn 0;
}

[牛客] Tree-换根dp(预防加法取模导致等0)相关推荐

  1. 2021牛客多校6 - Hopping Rabbit(矩形取模+扫描线)

    题目链接:点击查看 题目大意:二维平面给出 nnn 个矩形,现在要求找到一个点 (x+0.5,y+0.5)(x+0.5,y+0.5)(x+0.5,y+0.5),满足对于任意的 (x+0.5+k1d,y ...

  2. 牛客网j题(快速幂取模阶乘处理贝塔函数费马定理)

    传送门 求(贝塔函数运用) Γ(x)=∫01(x−x2)ndx=(n!)2/(2n+1)!\Gamma(x) = \int_0 ^1\ (x-x^2)^{n}dx=(n!)^2/(2n+1) !Γ(x ...

  3. 牛客多校1 - Infinite Tree(虚树+换根dp+树状数组)

    题目链接:点击查看 题目大意:给出一个无穷个节点的树,对于每个大于 1 的点 i 来说,可以向点 i / minvid[ i ] 连边,这里的 mindiv[ x ] 表示的是 x 的最小质因数,现在 ...

  4. 2020牛客多校第一场B虚树+质数筛+换根dp

    题目大意: 1.可以发现阶乘增长是很快的所以你要把整颗树建立出来是不实际的. 2.我们可以假设这棵树已经建出来出来了我们应该怎么搞 首先很明显是一个树形dp, 我们设dp[j],是以j为u到其他点距离 ...

  5. 换根dp求树所有节点的最小深度

    链接:https://ac.nowcoder.com/acm/contest/18072/A 牛妹有一张连通图,由n个点和n-1条边构成,也就是说这是一棵树,牛妹可以任意选择一个点为根,根的深度为0, ...

  6. 2019长沙学院新生赛(A水,B水,C(整除分块),D水,E(巧数学),F(二分+bfs),H(换根dp),I(线段树)J(dp+倍增+lca))

    A-XOR SUM 通过简单观察得知连续四个数的异或值就是等于0,暴力找出左区间和右区间就可以了,最多跑四个单位 0^1^2^3==0   4^5^6^7=0 #include<bits/std ...

  7. 树形dp ---- 树形换根dp F - The Maximum Subtree

    题目链接 题目大意: 给定一颗树,求这个树的最大子树,且这个子树是一个good-tree. good-tree的定义是:每个节点可以表示成一个数值区间,而树上的边表示两个点表示的数值区间相交 解题思路 ...

  8. BZOJ 2159 「国家集训队」Crash 的文明世界(第二类斯特林数,换根DP)【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2159 是 hydro 的 BZOJ ...

  9. 洛谷 - P4323 [JSOI2016]独特的树叶(树上哈希+换根dp)

    题目链接:点击查看 题目大意:给出一棵 n 个节点的树 A ,再给出一棵 n + 1 个节点的树 B,题目保证了树 B 是树 A 添加了一个叶子结点后的一棵树,只不过编号的顺序不同,现在问这个叶子节点 ...

最新文章

  1. linux命令:groupadd
  2. 面向初级 Web 开发人员的 Tomcat
  3. python 只取年月日 字符串_Python的数据类型
  4. MCtalk教育快报 | 0824
  5. mysql视图子查询_mysql创建视图不能包涵子查询的解决办法。View's SELECT contains a subquery in the FROM clause...
  6. 前端学习(1541):本地运行ng文档
  7. 中英翻译机c语言实验报告引言,课程设计--C语言关键字中英翻译机.doc
  8. 强化学习原理与python实现原理pdf_纯Python实现!Facebook发布PyTorch分布式强化学习库...
  9. 解决jquery调用NET webservice跨域的问题
  10. C语言 函数指针一(函数指针的定义)
  11. 力扣-62 不同路径
  12. screwing up
  13. Shopify!Shopify!Shopify!
  14. 移动APP切图术语解读:什么是@1x @2x和@3x
  15. Bundle Adjustment简述
  16. 【HDU5442】 Favorite Donut(后缀数组)
  17. Java基础-JVM
  18. exls表格搜索快捷键_excel搜索快捷键 如何在excel里快速找到需要的信息
  19. Pycharm正版2022.2.2 | 官方翻译插件更新tkk失败解决
  20. vivo手机删除自带程序方法

热门文章

  1. android studio button位置_免费的Android开发环境
  2. 一人之力也能抬起一辆大型箱车?
  3. 数学课本上的几大变态之处
  4. oracle中表截断是什么意思,Oracle截断表
  5. python程序设计实践教程陈东_Python
  6. mysql 卸载插件_MySQL 插件安装或卸载(window validate_password 为例)
  7. java设计模式face_java设计模式之-------原型模式
  8. require引入js vue_请教 关于使用require 引入vue 和公共js的问题
  9. typora公式zuo对齐_Markdown编辑神器-Typora
  10. 计算机专业的吸引力,计算机专业文献翻译-面向对象编程具有多方面的吸引力.doc...