*题目描述:



*题解:
树哈希+组合数学。对于树的形态相同的子树就一起考虑。
*代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>#ifdef WIN32#define LL "%I64d"
#else#define LL "%lld"
#endif#ifdef CT#define debug(...) printf(__VA_ARGS__)#define setfile()
#else#define debug(...)#define filename ""#define setfile() freopen(filename".in", "r", stdin); freopen(filename".out", "w", stdout);
#endif#define R register
#define getc() (S == T && (T = (S = B) + fread(B, 1, 1 << 15, stdin), S == T) ? EOF : *S++)
#define dmax(_a, _b) ((_a) > (_b) ? (_a) : (_b))
#define dmin(_a, _b) ((_a) < (_b) ? (_a) : (_b))
#define cmax(_a, _b) (_a < (_b) ? _a = (_b) : 0)
#define cmin(_a, _b) (_a > (_b) ? _a = (_b) : 0)
char B[1 << 15], *S = B, *T = B;
inline int FastIn()
{R char ch; R int cnt = 0; R bool minus = 0;while (ch = getc(), (ch < '0' || ch > '9') && ch != '-') ;ch == '-' ? minus = 1 : cnt = ch - '0';while (ch = getc(), ch >= '0' && ch <= '9') cnt = cnt * 10 + ch - '0';return minus ? -cnt : cnt;
}
#define maxn 500010
#define maxm 1000010
struct Edge
{int to;Edge *next, *rev;
}*last[maxn], e[maxm], *ecnt = e;
inline void link(R int a, R int b)
{*++ecnt = (Edge) {b, last[a], ecnt + 1}; last[a] = ecnt;*++ecnt = (Edge) {a, last[b], ecnt - 1}; last[b] = ecnt;
}
int rt[2], rtcnt, size[maxn], n, root;
void dfs(R int x, R int fa)
{size[x] = 1;R int maxx = 0;for (R Edge *iter = last[x]; iter; iter = iter -> next){R int pre = iter -> to;if (pre != fa){dfs(pre, x);size[x] += size[pre];cmax(maxx, size[pre]);}}cmax(maxx, n - size[x]);if (maxx <= n >> 1) rt[rtcnt++] = x;
}
int p[maxn], inp[maxn];
const int mod = 1e9 + 7;
inline int qpow(R int x, R int power)
{R int base = x, ans = 1;for ( ; power; power >>= 1, base = 1ll * base * base % mod)if (power & 1) ans = 1ll * ans * base % mod;return ans;
}
inline void prepare()
{R int _ = maxn - 1, tmp = 1;for (R int i = 2; i <= _; ++i)tmp = 1ll * tmp * i % mod;inp[_] = qpow(tmp, mod - 2);for (R int i = _ - 1; ~i; --i)inp[i] = 1ll * inp[i + 1] * (i + 1) % mod;
}
inline int C(R long long n, R int m)
{n %= mod; R long long tmp = 1;for (R int i = 1; i <= m; ++i) tmp = tmp * (n - i + 1) % mod;return tmp * inp[m] % mod;
}
inline int cl(R long long n, R int k)
{return C(n + k - 1, k);
}
//cl表示在n种无限多的物品内取k个的方案数
unsigned long long hash[maxn], hash2[maxn];
int st[maxn], top;
long long f[maxn][2]; //f[x][0..1]表示x节点取或者不取的方案数
inline bool cmp(R int x, R int y)
{return hash[x] > hash[y];
}
void dp(R int x, R int fa)
{f[x][0] = f[x][1] = 1ll;for (R Edge *iter = last[x]; iter; iter = iter -> next)if (iter -> to != fa)dp(iter -> to, x);top = 0;for (R Edge *iter = last[x]; iter; iter = iter -> next)if (iter -> to != fa)st[++top] = iter -> to;std::sort(st + 1, st + top + 1, cmp);for (R int i = 1, j; i <= top; i = j){for (j = i + 1; j <= top && hash[st[i]] == hash[st[j]] && hash2[st[i]] == hash2[st[j]]; ++j);f[x][0] = f[x][0] * cl(f[st[i]][0] + f[st[i]][1], j - i) % mod;f[x][1] = f[x][1] * cl(f[st[i]][0], j - i) % mod;}hash[x] = 123;for (R int i = 1; i <= top; ++i)hash[x] = (hash[x] * 1999 + 233 * hash[st[i]]) % 998244353;hash2[x] = 123;for (R int i = 1; i <= top; ++i)hash2[x] = (hash2[x] * 12579 + (hash2[st[i]] * 233)) % mod;
}
int main()
{
//  setfile();n = FastIn(); prepare();for (R int i = 1; i < n; ++i){R int a = FastIn(), b = FastIn();link(a, b);}dfs(1, 0);if (rtcnt == 2){R Edge *iter;for (iter = last[rt[0]]; iter; iter = iter -> next)if (iter -> to == rt[1]){iter -> to = iter -> rev -> to = ++n;break;}*++ecnt = (Edge) {rt[0], last[n], ecnt}; last[n] = ecnt;*++ecnt = (Edge) {rt[1], last[n], ecnt}; last[n] = ecnt;root = n;}else root = rt[0];dp(root, 0);R long long ans;if (rtcnt == 1)ans = (f[root][0] + f[root][1]) % mod;else{R int x = rt[0], y = rt[1];if (hash[x] == hash[y])ans = f[x][0] * f[y][1] % mod + cl(f[x][0], 2) % mod;elseans = (f[x][0] * f[y][0] % mod + f[x][0] * f[y][1] % mod + f[x][1] * f[y][0] % mod) % mod;}printf("%lld\n", ans % mod );return 0;
}
/*
input:
6
1 2
1 3
1 4
4 5
4 6
output:
9
*/

转载于:https://www.cnblogs.com/cocottt/p/6765002.html

【bzoj3162】独钓寒江雪相关推荐

  1. 洛谷4895 BZOJ3162 独钓寒江雪 树形dp 树哈希

    题目链接 题意: 给定一棵无根树,求其中本质不同的独立集的个数.独立集就是一个集合中的点之间都没有边直接相连.n<=5e5n<=5e5n<=5e5,对1e9+71e9+71e9+7取 ...

  2. bzoj3162 独钓寒江雪(树形dp+Hash)

    就是求无根树的本质不同的独立集个数.如果不考虑本质不同,则有树形dp. 考虑本质不同,就要考虑无根树的同构,可以用hash来搞.具体题解见:portal 我的hash真是冲突到死[再见],hash值最 ...

  3. BZOJ3162 独钓寒江雪【无根树同构问题】

    题目描述: 给定一棵无根树,求其中本质不同的独立集的个数. n<=500000 题目分析: 如果任选一点作根,那么它选1的情况和它选0的情况有可能是本质相同的. 但如果选重心作根(如果有两个重心 ...

  4. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  5. BZOJ 3162 独钓寒江雪(树同构计数)

    给定一棵无根树,求其中本质不同的独立集的个数. 无根树同构. 转化成以重心为根的有根树,如果重心有两个,就在这两个重心之间插入一个点与这两个重心连边,这个点作为新的重心. 然后就成了有根树同构过程树形 ...

  6. BZOJ 3162: 独钓寒江雪 树的同构 + 组合 + 计数

    Description Input Output 求一棵树编号序列不同的方案数: 令 $f[u],g[u]$ 分别表示 $u$ 选/不选 的方案数. 则 $f[u]=\prod_{v\in son[u ...

  7. 洛谷4895 独钓寒江雪 (树哈希+dp+组合)

    qwq 首先,如果是没有要求本质不同的话,那么还是比较简单的一个树形dp 我们令dp[i][0/1]dp[i][0/1]dp[i][0/1]表示是否iii的子树,是否选iii这个点的方案数. 一个比较 ...

  8. bzoj 3162: 独钓寒江雪 树哈希+树形dp

    题意 给出一棵无标号无根树,问本质不同的最大独立集数量.答案模1e9+7. n<=500000 分析 对于一般的情况,我们可以先找出树的重心作为根,然后进行树形dp.这样做有什么好处呢?通过根的 ...

  9. 使用openpyxl去操作Excel表格

    对表格的数据写操作: from openpyxl import Workbook wb=Workbook()w1=wb.create_sheet('index',0) # w1["E4&qu ...

  10. C# 操作Sql Server 学习总结

    C#中产生SQL语句的几种方式 (1)拼接产生SQL语句: string sql = "insert into czyb(yhm,mm,qx) values('" + txtNam ...

最新文章

  1. Java web 强制301跳转
  2. 自动驾驶汽车想成为主流?先过了这十二关再说
  3. CRM呼叫中心和社交媒体集成的技术实现
  4. tomcat:sessionId生成机制导致tomcat启动过慢问题
  5. C# 操作线程的通用类[测试通过]
  6. office365 自定义_IT外包观察,足不出户,Office365打造教学新体验?
  7. GIT上fork的项目获取最新源代码
  8. 阿尔伯塔大学计算机科学本科几年,本科——21阿尔伯塔大学CS专业早录取
  9. 创建一个dynamics 365 CRM online plugin (三) - PostOperation
  10. java string hash变量_java基础(六)-----String性质深入解析
  11. js实现DropDownList的数据筛选
  12. 新年的第一天学习状态感慨
  13. ArcGIS教程 - 2 ArcGIS基础知识
  14. 从零开始- Android刷机指南一
  15. 神经网络中warmup策略
  16. apisix健康检查测试
  17. vscode python无法跳转到函数定义
  18. (转载)WPARAM与LPARAM
  19. 项目管理-计算专题(三点估算、PERT估算)
  20. 几个编程语言的优缺点

热门文章

  1. 2017江苏高职计算机分数线,2017年江苏高考分数线公布
  2. c++实验3-个人所得税计算器
  3. 转载:医疗保险,公积金、养老、生育、工伤、失业保险
  4. 示波器的主要功能 示波器作用介绍
  5. 浅聊智能推荐下的人物画像
  6. python怎么编辑浏览器_怎样修改anaconda默认浏览器
  7. 【读书笔记】目标是什么
  8. Qt使用libvips处理超大图片(GB以上图片)
  9. 解决在HD Audio模式下Windows系统前置面板耳机无声音的问题
  10. IntelliJ IDEA中文汉化教程