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: 看似简单,倘若 ...
随机推荐
- vue技术分享之你可能不知道的7个秘密
本文是vue源码贡献值Chris Fritz在公共场合的一场分享,觉得分享里面有不少东西值得借鉴,虽然有些内容我在工作中也是这么做的,还是把大神的ppt在这里翻译一下,希望给朋友带来一些帮助. 一.善 ...
- Django:登录、注册、退出
创建项目: 一.创建项目 django-admin startproject form_test 二.创建应用 1.cd form_test 2.sudo ./manage.py startapp f ...
- 怎样使用 v-for ?
v-bind / v-on / v-if / v-for , 这四个指令应该是 vue 里面最常用的了, 之前已经简单记录的前三个的使用方法, 接下来就记一下 v-for 的基本用法. 1. v-fo ...
- 反射获取config实体类属性并赋值
/// <summary> /// 将实体类存入config /// </summary> /// <param name="enity">&l ...
- SVN客户端(TortoiseSVN)保存密码自动登录后,如何切换使用其它帐户登录方法
清除SVN客户端(TortoiseSVN)保存的认证信息(用户名和密码) 1.选择TortoiseSVN---->Settings. 2.点"Clear” ,清空Authenticat ...
- c++ 使用 gsoap 调用 WebService 中文乱码
c++ 使用 gsoap 调用 WebService 中文乱码 问题产生: 使用gsoap时,如果WebService服务端及客户调用端都使用 C++ , 再传递中文时不会存在乱码问题, 当客户 ...
- 基于JWT的token身份认证方案(转)
https://www.cnblogs.com/xiangkejin/archive/2018/05/08/9011119.html 一.使用JSON Web Token的好处? 1.性能问题. JW ...
- HBuilderX 打包
新建 - 云打包 (密钥 密码看不到 - 回车) ( ) BlueStacks蓝叠 模拟器看效果
- 记录一则ORA
应用服务器:Windows Server 2008 R2 Enterprise故障现象:项目侧同事反映应用服务器上的程序连接数据库报错:ORA-12560: TNS: 协议适配器错误 1.故障重现 2 ...
- A query was run and no Result Maps were found for...原来是mapper.xml文件出了问题,是使用MyBatis最常见的一种错误
今天遇到一个问题,原来是mapper.xml文件出了问题,是使用MyBatis最常见的一种错误 报错的结果是这样的: A query was run and no Result Maps were f ...