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)对奶牛的产奶率,但他 ...
随机推荐
- Linux 第一个静态库 (两种方法)
方法1 --------------------------------------------- Linux下 静态库 一般为.a为扩展名 类似 lib***.a 的文件名.利用静态函数库编译 ...
- C# 简单的对称加密
const string KEY_64 = "HuidTeac";//注意了,是8个字符 const string IV_64 = "HuidTeac"; pu ...
- Semaphore 类 的使用理解C#
示例 下面的代码示例创建一个信号量,其最大计数为3,初始计数为零. 该示例启动五个线程,这会阻止等待信号量. 主线程使用 Release(Int32) 方法重载将信号量计数增加到其最大值,从而允许三个 ...
- 七:使用Session进行会话管理
一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...
- UWP使用命名管道与桌面程序通信 (C#)
关于UWP的历史,其起源是Microsoft在Windows 8中引入的Metro apps.(后来又被称作Modern apps, Windows apps, Universal Windows A ...
- ES6扩展——正则扩展(u、y修饰符)
//下面三行代码效果一样 //全局匹配开头为a的 const regexp1 = /^a/g; const regexp2 = new RegExp('a','g'); const regexp3 = ...
- php常用的函数
addslashes: 字符串加入斜线.bin2hex: 二进位转成十六进位.chop: 去除连续空白.chr: 返回序数值的字符.chunk_split: 将字符串分成小段.convert_cyr_ ...
- JVM(一)类加载器与类加载过程
JVM是面试必面的一个知识点,也是高级程序员必备的一个技能.以下是JVM整体核心内容,包括类加载系统,运行时数据区内部结构,执行引擎,本地方法接口. 首先来学习类的加载器,虚拟机把描述类的数据从Cla ...
- Python - 面向对象编程 - 使用 super() 的一些注意事项
super() 详解 https://www.cnblogs.com/poloyy/p/15223443.html 多继承中使用 super() class A: def test(self): pr ...
- Pytest系列(15)- 多重校验插件之pytest-assume的详细使用
如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 pytest中可以用pyth ...