(开头先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】最强跳蚤的更多相关文章

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

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

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

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

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

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

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

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

  5. [JZOJ5229]【GDOI2018模拟7.14】小奇的糖果

    题目 题目大意 在一个二维的平面上,有一堆有颜色的点,你需要找出一条水平线段,使得这个线段上面(或者是下面)的点的颜色不包含所有的颜色.问点数最大是多少. 思考历程 在一开始,我看错了题目大意. 题目 ...

  6. [Swift通天遁地]九、拔剑吧-(14)创建更美观的景深视差滚动效果

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  7. UOJ 【UR #5】怎样跑得更快

    [UOJ#62]怎样跑得更快 题面 这个题让人有高斯消元的冲动,但肯定是不行的. 这个题算是莫比乌斯反演的一个非常巧妙的应用(不看题解不会做). 套路1: 因为\(b(i)\)能表达成一系列\(x(i ...

  8. [Xcode 实际操作]九、实用进阶-(14)使用富文本CoreText框架创建丰富多彩的文本

    目录:[Swift]Xcode实际操作 本文将演示如何使用富文本CoreText框架创建丰富多彩的文本图形. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] imp ...

  9. UOJ #22 UR #1 外星人

    LINK:#22. UR #1 外星人 给出n个正整数数 一个初值x x要逐个对这些数字取模 问怎样排列使得最终结果最大 使结果最大的方案数又多少种? n<=1000,x<=5000. 考 ...

随机推荐

  1. 关于C++程序运行程序是出现的this application has requested the runtime to terminate it in an unusual way. 异常分析

    今天运行程序是出现了this application has requested the runtime  to terminate it in an unusual way. 的异常报告,以前也经常 ...

  2. 51nod-字符串连接

    输入n个字符串s[i],你要把他们按某个顺序连接起来,使得字典序最小. (1 <= n <= 100) (每个字符串长度 <= 100) (字符串只包含小写字母) Input 第一行 ...

  3. js中的变量提升和函数提升

    从上周开始,我所在的学习小组正式开始了angular的学习,angular是全面支持es6的,所以语法上和以前的angular有了很大的不同,比如变量声明时就抛弃了var,而选择了let和const: ...

  4. django-2-路由配置及渲染方式

    <<<视图>>> (1)首先要注册创建好的app (2)配置路由 在app目录下新建一个urls.py模块 模块里面复制myproject目录下urls.py里面的 ...

  5. 紫书 习题7-13 UVa 817(dfs+栈求表达式的值)

    题目链接  点击打开链接 这道题分为两个部分, 一用搜索枚举每种可能, 二计算表达式的值, 有挺多细节需要注意 特别注意我的代码中在计算表达式的值中用到了一个!(代码枚举中的!表示不加符号, 我现在说 ...

  6. JS中的Set 与去重

    -----------------------Set 与去重----------------------- ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值.Se ...

  7. Vue轮播图插件---Vue-Awesome-Swiper

    轮播图插件 Vue-Awesome-Swiper 地址:https://github.com/surmon-china/vue-awesome-swiper 安装:npm install vue-aw ...

  8. Qt之窗体拖拽、自适应分辨率、自适应大小

    简述 在自定义无边框.标题栏的界面中,需要自己实现最小化.最大化.关闭.窗体背景等功能.最小化.最大化.关闭等按钮设计及功能比较简单,这里就不多做介绍.今天主要介绍一下绘制背景的问题,主要实现自适应屏 ...

  9. ActionBarActivity设置全屏无标题

    新建的Activity继承自ActionBarActivity,设置全屏无标题本来非常easy的事,可是没想到app居然无缘无故的挂,要么就是白屏一片,要么就是黑屏.坑了我一个多小时.!! 原因是Ac ...

  10. silverlight wpf Command提交时输入验证

    silverlight 或WPF在MVVM模式中使用INotifyDataErrorInfo接口对输入进行验证时 控件lostFocus时会触发验证,但在提交动作(例如button的Command)时 ...