(GDOI2018模拟九)【UOJ#192】【UR#14】最强跳蚤
(开头先Orz myh)
原题目:
在人类和跳蚤的战争初期,人们凭借着地理优势占据了上风——即使是最强壮的跳蚤,也无法一下越过那一堵坚固的城墙。
在经历了惨痛的牺牲后,跳蚤国王意识到再这样下去,跳蚤国必败无疑。然而为了震慑跳蚤国的老冤家——猴族,跳蚤国那世界上最跳的坦克只能留在跳蚤国本土,无法派上用场。
于是跳蚤国王决定利用跳蚤国最尖端的技术,创造出最强的跳蚤来挽回败局。
为了避免这样的低级失误,跳蚤国王决定使用机器来帮助他创造跳蚤。他把它拥有的 n 种属性放在了 n 个容器中,然后他使用了n−1 条橡胶软管将这 n 个容器连接成了一个树形结构(即任意两个容器之间有且只有一条简单路径)。
跳蚤国王的机器会使用这样的方式来创造跳蚤:跳蚤国王需要选择两个不同的容器u,v(u≠v),那么机器就会使用 u 到 v 的简单路径上的所有的橡胶软管将这条路上的所有属性汇聚到一起制造跳蚤。注意:这时只有 u 到 v 的简单路径上的橡胶软管被用到了。
每一条橡胶软管都有一个耐久度 wi,跳蚤国王认为一个制造的方案是安全的,当且仅当所有被用到的橡胶软管的耐久度的乘积是完全平方数。
现在,跳蚤国王想要知道有多少种不同的制造方案是安全的。但是因为跳蚤国王日理万机,所以他让你——一个刚刚被抓来的人类俘虏来帮他计算答案。
两个制造方案是不同的当且仅当 u 不同或者 v 不同。
输入格式
第一行两个正整数n(n<=100000),表示容器的数目。
以下n−1行,每行三个正整数u,v,w表示一条软管连接u,v,耐久度为w。
输出格式
输出一行一个整数表示制造方案数。
样例一
input
5
1 2 2
1 3 6
1 4 2
4 5 3
output
4
题目大意就是给你一棵有边权的树,让你求其中有多少个点对路径上的边权积为完全平方数。
一开始看这个一脸不可做啊……树剖也不行,点分治貌似行,但是我不会写啊……(貌似其实也不行)
(高阶百度搜索技巧)
其实当传统做法不行的时候,可以反过来看看题目本身的特殊条件。注意到他要求边权积为完全平方数,可以想到其中每个质因子都出现了偶数次。
考虑用什么办法可以判断某个数出现了偶数次,发现偶数个相同的数异或起来必定是0。
为了避免和其他数重复,可以把每个质数哈希一下(这里我懒了,直接用的rand(),导致分数也是rand(60,100))。
所以问题就转化为了求树上异或和为零的路径的个数。
易得当且仅当两个节点到根节点的异或和相等时它们间路径的异或和为0。
所以就可以直接一次dfs求出了^_^
时间复杂度:O(n)(预处理比较麻烦,貌似很多学长被卡常了)
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<ctime>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
struct edge{
int v,next;
ll w;
}a[];
int n,u,v,tot=,pr=,head[],pri[];
ll w,num[],ans=;
map<ll,ll>pp;
bool isp[];
ll rd(){
return (ll)((ll)(rand())<<)+rand();
}
void getprime(){
for(int i=;i<=;i++){
if(!isp[i])pri[++pr]=i;
for(int j=;j<=pr&&i*pri[j]<=;j++){
isp[i*pri[j]]=;
if(!(i%pri[j]))break;
}
}
for(int i=;i<=pr;i++){
pp[pri[i]]=rd();
}
}
void add(int u,int v,ll w){
a[++tot].v=v;
a[tot].w=w;
a[tot].next=head[u];
head[u]=tot;
}
void dfs(int u,int fa){
for(int tmp=head[u];tmp!=-;tmp=a[tmp].next){
int v=a[tmp].v;
if(v==fa)continue;
num[v]=num[u]^a[tmp].w;
dfs(v,u);
}
}
int main(){
memset(head,-,sizeof(head));
memset(isp,,sizeof(isp));
srand(time(NULL));
scanf("%d",&n);
getprime();
for(int i=;i<n;i++){
scanf("%d%d%lld",&u,&v,&w);
int ww=;
for(int j=;j<=pr&&pri[j]*pri[j]<=w;j++){
while(!(w%pri[j])){
w/=pri[j];
ww^=pp[pri[j]];
}
}
if(w!=){
if(!pp[w])pp[w]=rd();
ww^=pp[w];
}
add(u,v,ww);
add(v,u,ww);
}
num[]=;
dfs(,-);
sort(num+,num+n+);
for(int i=,j;i<=n;i=j){
j=i;
while(num[i]==num[j]&&j<=n)j++;
ans+=(ll)(j-i)*(j-i-);
}
printf("%lld",ans);
return ;
}
(GDOI2018模拟九)【UOJ#192】【UR#14】最强跳蚤的更多相关文章
- 【uoj#192】[UR #14]最强跳蚤 Hash
题目描述 给定一棵 $n$ 个点的树,边有边权.求简单路径上的边的乘积为完全平方数的点对 $(x,y)\ ,\ x\ne y$ 的数目. 题解 Hash 一个数是完全平方数,当且仅当每个质因子出现次数 ...
- 【胡策篇】题解 (UOJ 192 + CF938G + SPOJ DIVCNT2)
和泉纱雾与烟花大会 题目来源: UOJ 192 最强跳蚤 (只改了数据范围) 官方题解: 在这里哦~(说的很详细了 我都没啥好说的了) 题目大意: 求树上各边权乘积是完全平方数的路径数量. 这种从\( ...
- UOJ#192. 【UR #14】最强跳蚤
题目链接 http://uoj.ac/problem/192 暑期课第二天 树上问题进阶 具体内容看笔记博客吧 题意 n个节点的树T 边有边权w 求满足(u, v)上所有边权乘积为完全平方数的路径有多 ...
- UOJ #192 【UR #14】 最强跳蚤
题目链接:最强跳蚤 这道题本来不想写博客的--但是鉴于自己犯了低级错误,还是写篇博客记载一下. 一开始我的想法和题解里面的算法而比较类似,也是先分解质因数,然后用质因子是否出现偶数次来判断当前这个数是 ...
- [JZOJ5229]【GDOI2018模拟7.14】小奇的糖果
题目 题目大意 在一个二维的平面上,有一堆有颜色的点,你需要找出一条水平线段,使得这个线段上面(或者是下面)的点的颜色不包含所有的颜色.问点数最大是多少. 思考历程 在一开始,我看错了题目大意. 题目 ...
- [Swift通天遁地]九、拔剑吧-(14)创建更美观的景深视差滚动效果
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- UOJ 【UR #5】怎样跑得更快
[UOJ#62]怎样跑得更快 题面 这个题让人有高斯消元的冲动,但肯定是不行的. 这个题算是莫比乌斯反演的一个非常巧妙的应用(不看题解不会做). 套路1: 因为\(b(i)\)能表达成一系列\(x(i ...
- [Xcode 实际操作]九、实用进阶-(14)使用富文本CoreText框架创建丰富多彩的文本
目录:[Swift]Xcode实际操作 本文将演示如何使用富文本CoreText框架创建丰富多彩的文本图形. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] imp ...
- UOJ #22 UR #1 外星人
LINK:#22. UR #1 外星人 给出n个正整数数 一个初值x x要逐个对这些数字取模 问怎样排列使得最终结果最大 使结果最大的方案数又多少种? n<=1000,x<=5000. 考 ...
随机推荐
- php语法学习:轻松看懂PHP语言
基础语法 开头结尾 PHP脚本以 "<?php " 开头以 "?>" 结尾 <!DOCTYPE html> <html>&l ...
- swift使用查阅资料备份4
Swift - RxSwift的使用详解6(观察者2: 自定义可绑定属性) http://www.hangge.com/blog/cache/detail_1946.html extension UI ...
- table标签 在谷歌和ie浏览器下不同的表现效果
在项目中有了一个这样的需求: 我需要利用vue的模板语法v-for循环生成tr,这个tr是需要双重循环来确定其个数的, 我的实现: 我在tr外面包了一个template标签, 效果: 谷歌浏览器下实现 ...
- .net基础总复习(2)
第二天 文件操作常用类 File类 //操作文件的 //复制.剪切.创建.移除 //File.Create(@"C:\Users\BDSOFT\Desktop\new.txt" ...
- [NOIP补坑计划]NOIP2017 题解&做题心得
终于做完了…… 场上预计得分:?(省一分数线:295) 由于看过部分题解所以没有预计得分qwq 题解: D1T1 小凯的疑惑 题面 震惊!一道小学奥数题竟难倒无数高中考生! 欢迎大家以各种姿势*和谐* ...
- laravel save() 返回 null
原因:引用其他方法时,没有 return save()的操作结果. 在使用save()方法时,发现返回值是:null:
- Proxychains安装
没有管理员权限 1.建立文件夹proxychains,并进入下载 mkdir proxychains cd proxychains wget https://sourceforge.net/proje ...
- RabbitMQ消息可靠性分析 - 简书
原文:RabbitMQ消息可靠性分析 - 简书 有很多人问过我这么一类问题:RabbitMQ如何确保消息可靠?很多时候,笔者的回答都是:说来话长的事情何来长话短说.的确,要确保消息可靠不只是单单几句就 ...
- VUE:事件处理和表单输入绑定
事件处理 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...
- JVM运行原理详解
1.JVM简析: 作为一名Java使用者,掌握JVM的体系结构也是很有必要的. 说起Java,我们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Ja ...