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: 看似简单,倘若 ...
随机推荐
- 2019年十一月(CSP S游记及AFO)
DAY-4 晚自习和班里以及搞OI的两个dalao商量了下决定停课了,当时觉得停得好晚,有的dalao都停一个月了.(现在感觉是明智的选择,我OI辣么菜还不如专注文化课) 晚上回家洗了个澡. DAY- ...
- 使用Iview时候 报:no-parsing-error Parsing error: x-invalid-end-tag 解决办法
解决办法有两种解决办法: 1.MenuItem修改为:menu-item 2.在根目录下 .eslintrc.js 文件 rules 下添加: "vue/no-parsing-error&q ...
- Jmeter之TCP取样器
1.在线程组中添加“TCP取样器” 2.填写数据 以下截图是必须配置的 TCPClient classname: 填写TCP报文格式(有三类),默认前缀:org.apache.jmeter.prot ...
- C++入门基础知识(二)
一:引用 概念:是给一个已经存在的变量取一个别名,编译器不会为引用变量开辟内存空间,它和引用的变量公用一块内存空间. 例如: 类型& 引用变量名(对象名)= 引用实体 int& a = ...
- Validator自动验证与手动验证
自动: public JResult projectAdd(@Valid Project project, BindingResult result) {Map<String,Object> ...
- CentOS7 yum安装Mariadb
1.安装Mariadb #yum -y install mariadb mariadb-server 1.1当执行程序末端显示Complete则完成安装 2.安装完成后启动服务 # systemctl ...
- maven:无效的目标发行版:11
maven:无效的目标发行版:11 我之前在博客里是不记录bug和error的处理的,昨天听了一个资深程序员的视频,决定要改习惯了,记录一些自己平时遇到的问题 这个是我在mvn clean insta ...
- svn经典总结
大佬的svn:http://www.cnblogs.com/armyfai/p/3985660.html#!comments https://www.cnblogs.com/0zcl/p/730976 ...
- 1 sql server 中cursor的简介
1.游标的分类 游标共有3类:API服务器游标.Transaction-SQL游标和API客户端游标. 2 API服务器cursor共有如下几种 静态游标的完整结果集将打开游标时建立的结果集存储在临时 ...
- redis的使用(Java使用Jedis客户端连接redis)
一.添加依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis&l ...