题目

和成爷达成一致,被卡随机的话就是过了

考虑一个完全平方数的所有质因子次幂一定是偶数,于是对于每一条边我们都只保留其出现次数为奇数的质因子

注意到有一个点的\(w\leq 80\),于是考虑状压质因子,对于第\(i\)个质数,我们定义其权值为\(2^{i-1}\),这样我们就把每一条边的权值都变成了一个二进制数,现在只需要求有多少条路径的异或和为\(0\)即可,显然求一下每个点到根路径异或和,开个桶随便搞搞就完事了

对于\(w\leq 10^8\),我们不能再状压成二进制了,考虑对每个质因子设置一个\(\rm unsigned\ long \ long\)范围内的权值,一条边的权值就是所有出现次数为奇数的质因子权值的异或和,还是求有多少条路径异或为\(0\)

之后就被卡了,各种换随机种子也只有90

代码

#include <bits/stdc++.h>
#define re register
#define LL long long
#define max(a, b) ((a) > (b) ? (a) : (b))
#define ull unsigned long long
inline int read() {
char c = getchar();
int x = 0;
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - 48, c = getchar();
return x;
}
const int maxn = 1e5 + 5;
struct E {
int v, nxt;
ull w;
} e[maxn << 1];
int n, num, T, f[10005], p[10005];
int head[maxn], xx[maxn], yy[maxn], ww[maxn];
ull w[10005], pre[maxn];
std::map<int, ull> ma;
std::map<ull, int> tax;
inline void add(int x, int y, ull w) {
e[++num].v = y;
e[num].nxt = head[x];
head[x] = num;
e[num].w = w;
}
inline ull Rand() {
return (((ull)rand() % 32768ll) << 45ll) + (((ull)rand() % 32768ll) << 30ll) +
(((ull)rand() % 32768ll) << 15ll) + ((ull)rand() % 32768ll);
}
void dfs(int x, int fa) {
for (re int i = head[x]; i; i = e[i].nxt) {
if (e[i].v == fa)
continue;
pre[e[i].v] = pre[x] ^ e[i].w;
dfs(e[i].v, x);
}
}
int main() {
srand(19260817);
n = read();
for (re int i = 1; i < n; i++) xx[i] = read(), yy[i] = read(), ww[i] = read(), T = max(T, ww[i]);
T = std::ceil(std::sqrt(T));
for (re int i = 2; i <= T; i++) {
if (!f[i])
p[++p[0]] = i, w[p[0]] = Rand();
for (re int j = 1; j <= p[0] && p[j] * i <= T; ++j) {
f[p[j] * i] = 1;
if (i % p[j] == 0)
break;
}
}
for (re int i = 1; i < n; i++) {
int now = 0;
for (re int t = 0, j = 1; j <= p[0]; ++j, t = 0) {
if (ww[i] % p[j])
continue;
while (ww[i] % p[j] == 0) ww[i] /= p[j], t ^= 1;
now ^= (t * w[j]);
if (ww[i] == 1)
break;
}
if (ww[i] != 1) {
if (!ma[ww[i]])
ma[ww[i]] = Rand();
now ^= ma[ww[i]];
}
add(xx[i], yy[i], now), add(yy[i], xx[i], now);
}
dfs(1, 0);
LL ans = 0;
for (re int i = 1; i <= n; i++) ans += tax[pre[i]], tax[pre[i]]++;
printf("%lld\n", 2ll * ans);
return 0;
}

uoj192 【UR #14】最强跳蚤的更多相关文章

  1. 【uoj#192】[UR #14]最强跳蚤 Hash

    题目描述 给定一棵 $n$ 个点的树,边有边权.求简单路径上的边的乘积为完全平方数的点对 $(x,y)\ ,\ x\ne y$ 的数目. 题解 Hash 一个数是完全平方数,当且仅当每个质因子出现次数 ...

  2. UOJ #192 【UR #14】 最强跳蚤

    题目链接:最强跳蚤 这道题本来不想写博客的--但是鉴于自己犯了低级错误,还是写篇博客记载一下. 一开始我的想法和题解里面的算法而比较类似,也是先分解质因数,然后用质因子是否出现偶数次来判断当前这个数是 ...

  3. (GDOI2018模拟九)【UOJ#192】【UR#14】最强跳蚤

    (开头先Orz myh) 原题目: 在人类和跳蚤的战争初期,人们凭借着地理优势占据了上风——即使是最强壮的跳蚤,也无法一下越过那一堵坚固的城墙. 在经历了惨痛的牺牲后,跳蚤国王意识到再这样下去,跳蚤国 ...

  4. UOJ#192. 【UR #14】最强跳蚤

    题目链接 http://uoj.ac/problem/192 暑期课第二天 树上问题进阶 具体内容看笔记博客吧 题意 n个节点的树T 边有边权w 求满足(u, v)上所有边权乘积为完全平方数的路径有多 ...

  5. UOJ192 最强跳蚤

    题目链接 problem 给出一个n个点带边权的树,问有多少对\((u,v)\)满足\(u\)到\(v\)路径上边权的乘积为完全平方数. \(n\le 10^5,w\le 10^8\) solutio ...

  6. CSDN专家吐槽实录

    今天打开CSDN发现界面上的几个图标发生了变化,一个小小的变化,却引起了诸多CSDN专家对CSDN社区未来发展的思考,我特意从群里讲对话黏贴出来,希望各位能给予积极评价和建议. 你已经是群成员了,和大 ...

  7. 红黑树插入操作---以JDK 源码为例

    红黑树遵循的条件: 1.根节点为黑色. 2.外部节点(叶子节点)为黑色. 3.红色节点的孩子节点为黑色.(由此,红色节点的父节点也必为黑色) 4.从根节点到任一外部节点的路径上,黑节点的数量相同. 节 ...

  8. 【胡策篇】题解 (UOJ 192 + CF938G + SPOJ DIVCNT2)

    和泉纱雾与烟花大会 题目来源: UOJ 192 最强跳蚤 (只改了数据范围) 官方题解: 在这里哦~(说的很详细了 我都没啥好说的了) 题目大意: 求树上各边权乘积是完全平方数的路径数量. 这种从\( ...

  9. 【UER #1】[UOJ#12]猜数 [UOJ#13]跳蚤OS [UOJ#14]DZY Loves Graph

    [UOJ#12][UER #1]猜数 试题描述 这一天,小Y.小D.小C正在愉快地玩耍. 小Y是个数学家,他一拍脑袋冒出了一个神奇的完全平方数 n. 小D是个机灵鬼,很快从小Y嘴里套出了 n的值.然后 ...

随机推荐

  1. (14)centos7 进程管理

    一.查询进程 1. 进程显示 ps -a 显示当前所有的进程信息 -u 以用户的格式显示进程信息 -x 显示后台进程运行的参数 ps -aux #通常查看内存 USER #执行进程的用户 PID #进 ...

  2. Dubbo入门到精通学习笔记(二):Dubbo管理控制台、使用Maven构建Dubbo的jar包、在Linux上部署Dubbo privider服务(shell脚本)、部署consumer服务

    文章目录 Dubbo管理控制台 1.Dubbo管理控制台的主要作用: 2.管理控制台主要包含: 3.管理控制台版本: 安装 Dubbo 管理控制台 使用Maven构建Dubbo服务的可执行jar包 D ...

  3. Display与 Visibility的区别

    隐藏元素的方法有: display:none或visibility:hidden visibility:hidden可以隐藏某个元素,但隐藏的元素仍需占用与未隐藏之前一样的空间.也就是说,该元素虽然被 ...

  4. 绿盟-WEB应用漏洞扫描系统

    ************************************************** WEB应用漏洞扫描系统 一.工具的介绍与使用 ************************** ...

  5. squirrel sql client 连接phoenix

    1. 下载 squirrel sql client 客户端后 运行 2.复制必要的jar 包到 squirrel sql client 安装目录下 需要jar 包有: phoenix-core-4.6 ...

  6. 优雅地使用 VSCode 来编辑 vue 文件

    javascript visual-studio-code vue.js 当然 vscode 对 vue 也不是原生支持的,今天来扒一扒如何配置 vscode 以便优雅地编辑 vue 文件 先来扒一扒 ...

  7. 天道神诀---FTP服务

    FTP 2种模式 主动模式(默认) 客户端以1024-65535之间某一端口发送指令到服务端的21端口,并建立连接.服务端接受到以后,以20端口去连接客户端,建立一条新的链接并传输数据 被动模式 客户 ...

  8. hdu6311 /// 欧拉路径 无向图最小路径覆盖 输出正反路径

    题目大意: 给定n m 为图的点数和边数 接下来m行 u v 为u到v有一条边 要求最少几笔能画完图的所有边 输出每笔画过的路径编号 正数编号正向 负数编号反向 题解:https://www.cnbl ...

  9. js 正则替换的使用方法

    function compress(source) { const keys = {}; ⇽--- 存储目标key source.replace( /([^=&]+)=([^&]*)/ ...

  10. Java调用Linux下的shell命令并将结果以流的形式返回

    import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader; public cl ...