题目链接 http://uoj.ac/problem/192

暑期课第二天

树上问题进阶

具体内容看笔记博客吧

题意

n个节点的树T 边有边权w 求满足(u, v)上所有边权乘积为完全平方数的路径有多少条

看到“所有边权乘积为完全平方数” 想到完全平方数的特殊性

就是分解质因数后 质因数指数都为偶数

然后就想到分解边权质因数+判质路径边权奇偶性

后者由于奇数偶数的和的规律 可以使用抑或

偶就表示为0 奇就表示为一

那么如何存储呢?

状压?

空间之大 状压压不下

所以hash

对每一个要用的质数 取一个 [1, 2 ^ 64] 的随机数

出现一次就抑或一次即可

然后。。。

题意

n个节点的树T 边有边权w 求满足(u, v)上所有边权抑或和为0的路径有多少条

前缀和最常用的两种 一是累加和 二是抑或和

明显可以使用前缀和

又由于 a ^ a = 0

对于一条路径 (路径两端点的lca) 到 (根节点)的那一段抑或两次没啦

所以如果(u, v)上所有边权抑或和为0

那么他们的抑或前缀和相等

以下附莫名被ex扣下3分的辣鸡代码

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstdlib>
  4. #include <ctime>
  5. #include <map>
  6. using namespace std;
  7. const int N = 2e5 + ;
  8. const int M = 1e4 + ;
  9.  
  10. int n, m;
  11. struct Edge{
  12. int u, v;
  13. long long w;
  14. int next;
  15. }edge[N << ];
  16. int esize, head[N];
  17. long long p[M + ], ps;
  18. bool np[M];
  19. long long num[N];
  20. map<int, long long> rf;
  21.  
  22. inline void addedge(int x, int y, long long z){
  23. edge[++esize] = (Edge){x, y, z, head[x]};
  24. head[x] = esize;
  25. }
  26.  
  27. inline void p_cal(){
  28. for(int i = ; i < M; i++){
  29. if(!np[i]) p[++ps] = i;
  30. for(int j = ; j <= ps && i * p[j] < M; j++){
  31. np[i * p[j]] = ;
  32. if(!(i % p[j])) break;
  33. }
  34. }
  35. }
  36.  
  37. inline void build(int x, int fa){
  38. for(int i = head[x]; i != -; i = edge[i].next){
  39. int v = edge[i].v;
  40. if(v == fa) continue;
  41. num[v] = num[x] ^ edge[i].w;
  42. build(v, x);
  43. }
  44. }
  45.  
  46. int main(){
  47. srand(time(NULL));
  48. scanf("%d", &n);
  49. p_cal();
  50. for(long long i = ; i <= ps; i++)
  51. rf[p[i]] = ((long long)rand() << ) + rand();
  52. //rd续命法
  53. long long res;
  54. int x, y, z;
  55. for(int i = ; i <= n; i++) head[i] = -;
  56. for(int i = , x, y, z; i < n; i++){
  57. scanf("%d%d%d", &x, &y, &z);
  58. res = ;
  59. int tmp = z;
  60. for(int j = ; j <= ps && p[j] * p[j] <= tmp; j++)
  61. while(!(z % p[j]))
  62. res ^= rf[p[j]], z /= p[j];
  63. if(z != ) {
  64. if(!rf[z])
  65. rf[z] = ((long long)rand() << ) + rand();
  66. res ^= rf[z];
  67. }
  68. addedge(x, y, res); addedge(y, x, res);
  69. }
  70.  
  71. build(, -);
  72. sort(num + , num + n + );
  73. long long ans = ;
  74. for(int i = , j; i <= n; i = j){
  75. j = i;
  76. while(num[j] == num[i] && j <= n) j++;
  77. ans += (long long)(j - i) * (j - i - );
  78. }
  79. printf("%lld", ans);
  80. return ;
  81. }

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

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

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

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

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

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

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

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

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

  5. uoj192 【UR #14】最强跳蚤

    题目 和成爷达成一致,被卡随机的话就是过了 考虑一个完全平方数的所有质因子次幂一定是偶数,于是对于每一条边我们都只保留其出现次数为奇数的质因子 注意到有一个点的\(w\leq 80\),于是考虑状压质 ...

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

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

  7. UOJ192 最强跳蚤

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

  8. UOJ #22 UR #1 外星人

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

  9. UOJ.52.[UR #4]元旦激光炮(交互 思路)

    题目链接 \(Description\) 交互库中有三个排好序的,长度分别为\(n_a,n_b,n_c\)的数组\(a,b,c\).你需要求出所有元素中第\(k\)小的数.你可以调用至多\(100\) ...

随机推荐

  1. BZOJ3817 清华集训2014 Sum 类欧几里得

    传送门 令\(\sqrt r = x\) 考虑将\(-1^{\lfloor d \sqrt r \rfloor}\)魔改一下 它等于\(1-2 \times (\lfloor dx \rfloor \ ...

  2. mac brew update 报错

    环境为mac, 总共报了三种错误. 对应三种不同的解法. 1.   第一种如下, 提示 1.8 的版本找不到 $ brew update /usr/local/bin/brew: /usr/local ...

  3. koa2入门(2) koa-router 路由处理

    项目地址:https://github.com/caochangkui/demo/tree/koa-test 1. 创建项目 创建目录 koa-test npm init 创建 package.jso ...

  4. 线程池(ThreadPool)

    线程池概述 由系统维护的容纳线程的容器,由CLR控制的所有AppDomain共享.线程池可用于执行任务.发送工作项.处理异步 I/O.代表其他线程等待以及处理计时器. 线程池与线程 性能:每开启一个新 ...

  5. VS2017登陆不了,TFS无法连接成功的问题

    由于使用的win7 64位操作系统,重装系统以后,安装了vs2017,登陆不成功,https://auth.gfx.ms/16.000.27887.2/OldConvergedLogin_PCore. ...

  6. 大话重构连载15:采用Mock技术完成测试

    第五次重构我们引入了数据库的设计,用户信息要从数据库中读取,问候语库存储在数据库中,并支持添加与更新.数据库的引入使自动化测试变得困难了,因为数据状态总是变化着的,而这种变化使得测试过程不能复现,这是 ...

  7. RetrieveFavicon 获取任何站点的 favicon

    原文发表于我的技术博客 开源了一个获取任何站点 favicon 的类库,供使用. 原文发表于我的技术博客 RetrieveFavicon Project GitHub Retrieve favicon ...

  8. zabbix问题记录

    zabbix部署好,在使用一段时间后,出现了不少报错,在此简单做一记录.1)Zabbix监控界面报错Lack of free swap space on Zabbix server”解决公司线上部署的 ...

  9. ZooKeeper 典型的应用场景——及编程实现

    如何使用 Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper 并不是用来专门存储 ...

  10. Notes of Daily Scrum Meeting(12.25)

    今天在学姐的帮助下,我们终于把网络连接的部分连通了,这对我们是一个很大的鼓舞,也找到了前期 连不通的问题在哪里,这让我们重新有了进行下去的勇气和决心,我们会在最后这几天把前端和后端结合, 做出我们最后 ...