CF990G-GCD Counting【dfs】
正题
题目链接:https://www.luogu.com.cn/problem/CF990G
题目大意
给出一棵有点权的树,对于每个\(k\)求有多条路径的点权\(gcd\)为\(k\)
\(1\leq n\leq 2\times 10^5,1\leq a_i\leq 2\times 10^5\)
解题思路
开始以为要莫反,后来发现不用。
首先\(gcd\)之间拆倍数,设\(f_i\)表示点权都是\(i\)的倍数的路径条数,这个用一个\(vector\)存然后暴力枚举\(i\)加点每次\(dfs\)出每个联通块的大小就好了。
之后倒序枚举\(i\),再枚举它的倍数\(ik\),然后\(f_i-=f_{ik}\),这样就自动容斥,用不上莫比乌斯反演了。
时间复杂度\(O(\sum_{i=1}^n\sigma_0(a_i)+n\log n)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
using namespace std;
const ll N=2e5+10;
ll n,w[N],v[N],f[N];
vector<ll> p[N],G[N];
//void Prime(){
// mu[1]=1;
// for(ll i=2;i<N;i++){
// if(!v[i])v[i]=1,pri[++cnt]=i,mu[i]=-1;
// for(ll j=1;j<=cnt&&i*pri[j]<N;j++){
// v[i*pri[j]]=1;
// if(i%pri[j]==0)break;
// mu[i*pri[j]]=-mu[i];
// }
// }
// return;
//}
ll Add(ll x,ll fa,ll k){
v[x]=k;ll siz=0;
for(ll i=0;i<G[x].size();i++){
ll y=G[x][i];
if(y==fa||w[y]%k)continue;
siz+=Add(y,x,k);
}
return siz+1;
}
signed main()
{
scanf("%lld",&n);
for(ll i=1;i<=n;i++){
scanf("%lld",&w[i]);
p[w[i]].push_back(i);
}
for(ll i=1;i<n;i++){
ll x,y;
scanf("%lld%lld",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
}
for(ll i=1;i<=2e5;i++)
for(ll j=i;j<=2e5;j+=i)
for(ll k=0;k<p[j].size();k++){
ll x=p[j][k];
if(v[x]==i)continue;
ll siz=Add(x,x,i);
f[i]+=siz*(siz+1)/2;
}
for(ll i=2e5;i>=1;i--)
for(ll j=2*i;j<=2e5;j+=i)
f[i]-=f[j];
for(ll i=1;i<=2e5;i++)
if(f[i])printf("%lld %lld\n",i,f[i]);
return 0;
}
CF990G-GCD Counting【dfs】的更多相关文章
- POJ2386 Lake Counting 【DFS】
Lake Counting Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20782 Accepted: 10473 D ...
- 【第40套模拟题】【noip2011_mayan】解题报告【map】【数论】【dfs】
目录:1.潜伏者 [map] 2.Hankson的趣味题[数论]3.mayan游戏[dfs] 题目: 1. 潜伏者(spy.pas/c/cpp)[问题描述]R 国和S 国正陷入战火之中,双方都互派间谍 ...
- Kattis - glitchbot 【DFS】
Kattis - glitchbot [DFS] 题意 有一个机器人 刚开始在(0, 0),然后给出一个目标点,并且会给出一系列指令,但是其中会有一个指令是错误的.我们需要找出那个指令,并且改成正确的 ...
- HDU 6113 度度熊的01世界 【DFS】(2017"百度之星"程序设计大赛 - 初赛(A))
度度熊的01世界 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 【dfs】P1331 海战
题目描述 在峰会期间,武装部队得处于高度戒备.警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机.此外,巡洋船只和舰队将被派去保护海岸线.不幸的是因为种种原因,国防海军部仅有很少的几 ...
- 【dfs】p1731 生日蛋糕
1441:[例题2]生日蛋搞 [题目描述] 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体.设从下往上数第i(1≤i≤M)层蛋糕是半径为Ri, 高 ...
- 【dfs】LETTERS
1212:LETTERS [题目描述] 给出一个roe×colroe×col的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母.问最多可以经过几个字母. [ ...
- 洛谷P1605 迷宫【dfs】
题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...
- 【dfs】BZOJ1703-[Usaco2007 Mar]Ranking the Cows 奶牛排名
[题目大意] 农夫约翰有N(1≤N≤1000)头奶牛,每一头奶牛都有一个确定的独一无二的正整数产奶率.约翰想要让这些奶牛按产奶率从高到低排序,约翰已经比较了M(1≤M≤10000)对奶牛的产奶率,但他 ...
随机推荐
- lwm2m 协议
1.DTLS介绍 1.1 DTLS的作用 互联网先驱们最开始在设计互联网协议时主要考虑的是可用性,安全性是没有考虑在其中的,所以传输层的TCP.UDP协议本身都不具备安全性.SSL/TLS协议是基于T ...
- C 静态存储动态存储
首先,我们可以把程序所占的内存空间分为三个部分:(可以根据静态资源区.栈区.堆区来划分) 静态存储:程序运行期间由系统分配固定得到存储空间(栈): 动态存储:开发者根据自身需要进行动态分配的存储空间( ...
- 【转】分布式之redis复习精讲
转自:https://www.cnblogs.com/rjzheng/p/9096228.html 引言 为什么写这篇文章? 博主的<分布式之消息队列复习精讲>得到了大家的好评,内心诚惶诚 ...
- 如何用Mybatis逆向工程实现分页查询(更改生成的Example)
如何用Mybatis逆向工程实现分页查询 一个很简单的方法,如果要mysql实现分页查询的话,执行下述语句即可 select * from table limit (offset)5,(limit) ...
- Python - 面向对象编程 - 类变量、实例变量/类属性、实例属性
什么是对象和类 https://www.cnblogs.com/poloyy/p/15178423.html 什么是 Python 类.类对象.实例对象 https://www.cnblogs.com ...
- 眼见为实,看看MySQL中的隐藏列!
在介绍mysql的多版本并发控制mvcc的过程中,我们提到过mysql中存在一些隐藏列,例如行标识.事务ID.回滚指针等,不知道大家是否和我一样好奇过,要怎样才能实际地看到这些隐藏列的值呢? 本文我们 ...
- 小程序es6
在小程序中使用ES6的新特性ECMAScript 6(简称ES6)是于2015年6月正式发布的JavaScript语言的标准,正式名为ECMAScript 2015(ES2015). 小程序在很久之前 ...
- 大厂的 SDK 写法,偷学到了!
自己动手写 SDK 的经验技巧分享 大家好,我是鱼皮. 最近因为工作需要,自己动手写了一些项目的通用 SDK.在编写的过程中,我阅读和参考了不少公司中其他大佬写的 SDK,也总结了一些开发 SDK 的 ...
- Python实现Thrift Server
近期在项目中存在跨编程语言协作的需求,使用到了Thrift.本文将记录用python实现Thrift服务端的方法. 环境准备 根据自身实际情况下载对应的Thrift编译器,比如我在Windows系统上 ...
- noip模拟37
\(\color{white}{\mathbb{燕子来时青尚在,木荫遥看杏花菲,名之以:杏红}}\) 考场发现 \(t2\) 基本上是原题,\(t3\) 的套路见过,\(t4\) 像是并查集之类的算法 ...