(开头先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. Smalltalk

    Smalltalk is an object-oriented, dynamically typed, reflective programming language. Smalltalk was o ...

  2. ASP版_阿里大于短信API Demo

    阿里大于申请地址:http://www.alidayu.com 阿里大于短信发送Demo: ******index.asp************* <%@LANGUAGE="VBSC ...

  3. Codeforces Round #493 (Div. 2) A. Balloons 贪心水题

    由于是输出任意一组解,可以将价值从小到大进行排序,第一个人只选第一个,第二个人选其余的.再比较一下第一个人选的元素和第二个人所选元素和是否相等即可.由于已将所有元素价值从小到大排过序,这样可以保证在有 ...

  4. HDU 4535 吉哥系列故事——礼尚往来( 错排水题 )

    链接:传送门 思路:错排模板题,水题是非常浪费时间的. /*********************************************************************** ...

  5. [读书笔记] R语言实战 (二) 创建数据集

    R中的数据结构:标量,向量,数组,数据框,列表 1. 向量:储存数值型,字符型,或者逻辑型数据的一维数组,用c()创建 **  R中没有标量,标量以单元素向量的形式出现 2. 矩阵:二维数组,和向量一 ...

  6. android开发面试题

    找了将近两个星期的工作,面试了5家公司,罗列一下笔试或者面试时的问题,祝大家好运 1,handler机制 答:handler执行机制:1).在主线程中创建handler 2).子线程中借助主线程的ha ...

  7. UNIX环境高级编程(6):文件I/O(2)

    文件共享: UNIX系统支持在不同进程间共享打开的文件. 内核使用三种数据结构表示打开的文件.他们之间的关系决定了在文件共享方面一个进程对还有一个进程可能产生的影响: (1)每一个进程在进程表中都有一 ...

  8. [Javascirpt] Developer-friendly Flow Charts with flowchart.js

    Flowchart.js is a great tool for creating quick, simple flowcharts in a way that keeps you out of a ...

  9. python-Pymyslql-requests_html:把腾讯新闻的今日推荐和链接存进数据库

    使用pumsql封装的部分功能 request_html:打开www.qq.com的例子 结果: PS:记得处理数据

  10. jquery时间格式化插件

    插件的代码: (function($){ $.formatDate = function(pattern,date){ //假设不设置,默觉得当前时间 if(!date) date = new Dat ...