CF990G GCD Counting 点分治+容斥+暴力
只想出来 $O(nlogn\times 160)$ 的复杂度,没想到还能过~
Code:
#include <cstdio>
#include <vector>
#include <algorithm>
#define N 200004
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int n;
vector<int>v[N];
ll answer[N],anss[N];
int prime[N],is[N],tot;
int val[N],hd[N],to[N<<1],nex[N<<1],edges;
int size[N],vis[N],mx[N],root,sn;
int tl,tmp[N],viss[N];
ll f[N],g[N];
void add(int u,int v)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
}
void init()
{
int i,j;
for(i=2;i<N;++i)
{
if(!is[i]) prime[++tot]=i;
for(j=1;j<=tot&&prime[j]*i<N;++j)
{
is[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
for(i=1;i<N;++i)
for(j=i;j<N;j+=i)
v[j].push_back(i);
}
void getroot(int u,int ff)
{
size[u]=1,mx[u]=0;
for(int i=hd[u];i;i=nex[i])
if(to[i]!=ff&&!vis[to[i]])
getroot(to[i],u),size[u]+=size[to[i]],mx[u]=max(mx[u],size[to[i]]);
mx[u]=max(mx[u],sn-size[u]);
if(mx[u]<mx[root]) root=u;
}
void dfs(int u,int ff,int num)
{
num=__gcd(num,val[u]);
tmp[++tl]=num;
for(int i=hd[u];i;i=nex[i])
if(to[i]!=ff&&!vis[to[i]])
dfs(to[i],u,num);
}
void calc(int u)
{
int i,j;
tl=0;
for(i=0;i<v[val[u]].size();++i) ++f[v[val[u]][i]],++anss[v[val[u]][i]];
for(i=hd[u];i;i=nex[i])
{
if(vis[to[i]]) continue;
int re=tl+1;
dfs(to[i],u,val[u]);
for(j=re;j<=tl;++j)
{
int a=tmp[j];
for(int k=0;k<v[a].size();++k) ++g[v[a][k]];
}
for(j=re;j<=tl;++j)
{
int a=tmp[j];
for(int k=0;k<v[a].size();++k)
if(!viss[v[a][k]])
{
anss[v[a][k]]+=1ll*f[v[a][k]]*g[v[a][k]],viss[v[a][k]]=1;
f[v[a][k]]+=g[v[a][k]];
}
}
for(j=re;j<=tl;++j)
{
int a=tmp[j];
for(int k=0;k<v[a].size();++k)
{
viss[v[a][k]]=0,g[v[a][k]]=0;
}
}
}
for(i=0;i<v[val[u]].size();++i) f[v[val[u]][i]]=0;
for(i=1;i<=tl;++i)
{
int a=tmp[i];
for(j=0;j<v[a].size();++j)
f[v[a][j]]=g[v[a][j]]=viss[v[a][j]]=0;
} }
void solve(int u)
{
vis[u]=1,calc(u);
for(int i=hd[u];i;i=nex[i])
if(!vis[to[i]])
root=0,sn=size[to[i]],getroot(to[i],u),solve(root);
}
int main()
{
init();
int i,j,Mx=0;
// setIO("input");
scanf("%d",&n);
for(i=1;i<=n;++i) scanf("%d",&val[i]),Mx=max(Mx,val[i]);
for(i=1;i<n;++i)
{
int a,b;
scanf("%d%d",&a,&b),add(a,b),add(b,a);
}
mx[root=0]=sn=n,getroot(1,0),solve(root);
for(i=Mx;i>=1;--i)
{
answer[i]=anss[i];
for(j=i+i;j<=Mx;j+=i) answer[i]-=answer[j];
}
for(i=1;i<=Mx;++i) if(answer[i]) printf("%d %lld\n",i,answer[i]);
return 0;
}
CF990G GCD Counting 点分治+容斥+暴力的更多相关文章
- 2019.03.29 NOIP训练 友好国度(点分治+容斥)
传送门 思路: 直接上点分治+容斥计算每个因数对应的贡献即可. 代码: #include<bits/stdc++.h> #define ri register int using name ...
- bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形 容斥
1914: [Usaco2010 OPen]Triangle Counting 数三角形 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 272 Sol ...
- hdu 5664 Lady CA and the graph(树的点分治+容斥)
题意: 给你一个有n个点的树,给定根,叫你找第k大的特殊链 .特殊的链的定义:u,v之间的路径,经过题给的根节点. 题解:(来自BC官方题解) 对于求第k大的问题,我们可以通过在外层套一个二分,将其转 ...
- HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- hdu2588 GCD 给定n,m。求x属于[1,n]。有多少个x满足gcd(x,n)>=m; 容斥或者欧拉函数
GCD Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepted Sub ...
- CF1101D GCD Counting 点分治+质因数分解
题意:求最长的树上路径点值的 $gcd$ 不为 $1$ 的长度. 由于只要求 $gcd$ 不为一,所以只要 $gcd$ 是一个大于等于 $2$ 的质数的倍数就可以了. 而我们发现 $2\times 1 ...
- HDU 4675 GCD of Sequence(容斥)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4675 题意:给出n,m,K,一个长度为n的数列A(1<=A[i]<=m).对于d(1< ...
- HDU 1695 GCD 欧拉函数+容斥定理
输入a b c d k求有多少对x y 使得x在a-b区间 y在c-d区间 gcd(x, y) = k 此外a和c一定是1 由于gcd(x, y) == k 将b和d都除以k 题目转化为1到b/k 和 ...
- 数论 + 容斥 - HDU 4059 The Boss on Mars
The Boss on Mars Problem's Link Mean: 给定一个整数n,求1~n中所有与n互质的数的四次方的和.(1<=n<=1e8) analyse: 看似简单,倘若 ...
随机推荐
- spring boot 2.0 提示 No primary or default constructor found for interface Pageable 解决办法
在SpringBoot 2.0 以前,我们会配置以下类 @Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter ...
- 6-Perl 标量
1.Perl 标量标量是一个简单的数据单元.标量可以是一个整数,浮点数,字符,字符串,段落或者一个完整的网页.以下实例演示了标量的简单应用:实例#!/usr/bin/perl$age = 20; # ...
- luogu题解 P3811 【【模板】乘法逆元】
upd--7.6 原线性求逆元代码有另一种更优写法 题目链接: https://www.luogu.org/problemnew/show/P3811 概念: 一想到JXOI 2018考场上忘记逆元怎 ...
- mqtt协议实现 java服务端推送功能(三)项目中给多个用户推送功能
接着上一篇说,上一篇的TOPIC是写死的,然而在实际项目中要给不同用户 也就是不同的topic进行推送 所以要写活 package com.fh.controller.information.push ...
- 防止表单提交时刷新页面-阻止form表单的默认提交行为
最近在写 ajax 提交的时候遇到一个问题,在执行 ajax 提交之后,浏览器页面自动刷新了,主要是没有 由于form 表单的默认提交行为.一下是几种阻止 form 表单默认提交行为的方式. 1.使用 ...
- 如何将编译后的文件打包成jar文件
如果需要修改像spring和dubbo中的jar包源码,修改后怎么打包呢? 如下: 1.win+r进入命令行: 2.找到需要打包的class文件: 3.jar -cvf [jar包的名字] [需要打包 ...
- Linux之远程文件传输
1)scp scp命令用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器硬盘变为只读re ...
- java面试4
1.两个对象a和b,请问a==b和a.equals(b)有什么区别? a==b; 比较对象地址 a.equals(b);如果a对象没有重写equals方法,效果和==相同,如果重写了就按照重写的规则比 ...
- latex中文环境配置(针对北大模板,开题报告+中期答辩+毕业论文)
最近自己在忙着开题,中文环境真的是emm 以下只针对北大的毕业论文模板,至于其他的中文环境没有尝试 主要是用不同的latex编辑器会报不同的错误,当然我最后还是统一成了pdflatex,经过无数次尝试 ...
- Scrapy框架之Spider模板 转
一.安装scrapy 首先安装依赖库Twisted pip install (依赖库的路径) 在这个网址http://www.lfd.uci.edu/~gohlke/pythonlibs#twiste ...