题意

https://codeforces.com/contest/990/problem/G


思考

在200000以内,因数个数最多的数位166320,共有160个因数。可以知道,从一个节点向下走最多只会有160种取值。

记集合f[u]为从u节点向下走可以取得的所有值及其个数,暴力转移即可。

至于合并,博主写了平方.......但这题想造出极端数据也是困难的。

最后注意空间。


代码

 #include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const int maxn=2E5+;
const ll base=2E5+;
int n,val[maxn];
int head[maxn*],size;
ll ans[maxn],wait[maxn];
bool vis[maxn];
inline int gcd(int x,int y)
{
return x%y==?y:gcd(y,x%y);
}
struct edge
{
int to,next;
}E[maxn*];
inline void add(int u,int v)
{
E[++size].to=v;
E[size].next=head[u];
head[u]=size;
}
struct note
{
int x,c;
note(int a=,int b=)
{
x=a,c=b;
}
};
queue<note>T[maxn];
vector<note>t;
void dfs(int u,int F)
{
vector<int>what;
for(int i=head[u];i;i=E[i].next)
{
int v=E[i].to;
if(v==F)
continue;
dfs(v,u);
}
for(int i=head[u];i;i=E[i].next)
{
int v=E[i].to;
if(v==F)
continue;
t.clear();
while(!T[v].empty())
{
t.push_back(T[v].front());
T[v].pop();
}
for(int j=;j<what.size();++j)
{
int x=what[j];
for(int k=;k<t.size();++k)
ans[gcd(x,t[k].x)]+=wait[x]*t[k].c;
}
for(int j=;j<t.size();++j)
{
int x=gcd(val[u],t[j].x);
if(!vis[x])
{
vis[x]=;
wait[x]=t[j].c;
what.push_back(x);
}
else
wait[x]+=t[j].c;
}
}
if(!vis[val[u]])
{
vis[val[u]]=;
wait[val[u]]=;
what.push_back(val[u]);
}
else
++wait[val[u]];
for(int i=;i<what.size();++i)
{
ll x=what[i];
ans[x]+=wait[x];
T[u].push(note(x,wait[x]));
vis[x]=wait[x]=;
}
}
int get(int x)
{
int sum=;
for(int i=;i*i<=x;++i)
if(x%i==)
sum+=;
return sum;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=;i<=n;++i)
cin>>val[i];
for(int i=;i<=n-;++i)
{
int x,y;
cin>>x>>y;
add(x,y);
add(y,x);
}
dfs(,);
for(int i=;i<=;++i)
if(ans[i])
cout<<i<<" "<<ans[i]<<endl;
return ;
}

CF990G的更多相关文章

  1. CF990G GCD Counting 点分治+容斥+暴力

    只想出来 $O(nlogn\times 160)$ 的复杂度,没想到还能过~ Code: #include <cstdio> #include <vector> #includ ...

  2. 树上莫比乌斯反演+分层图并查集——cf990G

    /* 树上莫比乌斯反演 求树上 满足 d|gcd(au,av) gcd(au,av)的对数f(d) 如何求: 建立200000层新图,即对于每个数建立一个新图 在加边时,给gcd(au,av)的约数层 ...

  3. GCD Counting Codeforces - 990G

    https://www.luogu.org/problemnew/show/CF990G 耶,又一道好题被我浪费掉了,不会做.. 显然可以反演,在这之前只需对于每个i,统计出有多少(x,y),满足x到 ...

  4. CF990G-GCD Counting【dfs】

    正题 题目链接:https://www.luogu.com.cn/problem/CF990G 题目大意 给出一棵有点权的树,对于每个\(k\)求有多条路径的点权\(gcd\)为\(k\) \(1\l ...

随机推荐

  1. HBase 原理

    遗留问题: 数据在更新时首先写入Log(WAL log)和内存(MemStore)中,MemStore中的数据是排序的,当MemStore累计到一定阈值时,就会创建一个新的MemStore,并且将老的 ...

  2. vim 方式快捷编辑代码

    说明 **I: ** 行首插入 **a: ** 追加 **A: ** 行尾插入 **R: ** 替换文字 **v: ** 选择 **ctrl-v: ** 选择举行区域 **x: ** 删除 **dd: ...

  3. 「SP122」STEVE - Voracious Steve 解题报告

    SP122 STEVE - Voracious Steve 题意翻译 Problem Steve和他的一个朋友在玩游戏,游戏开始前,盒子里有 n个甜甜圈,两个人轮流从盒子里抓甜甜圈,每次至少抓 1个, ...

  4. 「CF242E」XOR on Segment 解题报告

    题面 长度为\(n\)的数列,现有两种操作: 1.区间异或操作 2.区间求和操作 对于每个查询,输出答案 思路: 线段树+二进制拆位 线段树区间修改一般使用的都是懒标记的方法,但是对于异或,懒标记的方 ...

  5. 高斯消去法解线性方程组(MPI)

    用一上午的时间,用MPI编写了高斯消去法解线性方程组.这次只是针对单线程负责一个线程方程的求解,对于超大规模的方程组,需要按行分块,后面会在这个基础上进行修改.总结一下这次遇到的问题: (1)MPI_ ...

  6. mysql索引最佳实践

    索引最佳实践使用的表CREATE TABLE `employees` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(24) NOT ...

  7. C++Primer第五版 3.2.3节练习

    练习 3.6:编写一段程序,使用范围for语句将字符串内的所有字符用X代替. #include<iostream> #include<string> using namespa ...

  8. AES中ECB模式的加密与解密(Python3.7)

    本文主要解决的问题 本文主要是讲解AES加密算法中的ECB模式的加密解密的Python3.7实现.具体AES加密算法的原理这里不做过多介绍,想了解的可以参考文末的参考链接. 主要解决了两个问题: 在P ...

  9. python的range()

    range() 是一个函数,用来生成一个自然数的序列   用list()显示具体内容 扩展 # range()是一个函数,可以用来生成一个自然数的序列 r = range(5) # 生成一个这样的序列 ...

  10. 浏览器应用集成嵌入WPS指南

    因为该WPS插件使用NPAPI机制来和浏览器交互,故要求使用插件的浏览器必须支持NPAPI机制且必须开启NPAPI机制. 以下是支持的常见的浏览器及其版本: FireFox浏览器52及小于52的版本( ...