题意

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. python3中map函数

    map函数是Python里面比较重要的函数 map函数后面必须接的是序列(元组/列表/字符串) 在python2中执行一些语句 >>> map(str,[1,2,3,4]) ['1' ...

  2. 解决Win10电脑右下角的“激活windows转到电脑设置”的水印的方法

    Win10正式版的用户反馈新系统在使用一段时候后,自己电脑桌面右下角就突然出现了“激活windows10转到设置以激活windows”的水印字样.这是怎么回事呢?下面,我就向大家分享win10电脑右下 ...

  3. 第二阶段:4.商业需求文档MRD:4.PRD-用例和规则

    类似之前的泳道图 可以在下面添加一些描述 有时候用图还是会有一些限制 不能够很好的表达

  4. Kafka学习笔记(四)—— API使用

    Kafka学习笔记(四)-- API使用 1.Producer API 1.1 消息发送流程 Kafka的Producer发送消息采用的是异步发送的方式.在消息发送的过程中,涉及到了两个线程--mai ...

  5. 对sql server查询速度的优化

    处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考 ...

  6. $vjudge\ CSP-S$专题专练题解

    照例先放个链接$QwQ$ $A$ $QwQ$之前写过题解辣. 重新说下趴,就给横坐标纵坐标也开点,然后每个点连向对应横纵坐标边权为$0$,相邻横坐标点之间连边,相邻纵坐标点之间连边,跑个最短路就完事$ ...

  7. FTP服务器红帽5.4搭建图文教程!!!

    FTP服务器搭建 服务器的环境 红帽5.4 vm15 挂载光盘 mount mount -t iso9660 设备目录 /mnt 表示挂载 软件包安装 FTP服务器安装包命令: rpm -ivh /m ...

  8. 1053 住房空置率 (20 分)C语言

    在不打扰居民的前提下,统计住房空置率的一种方法是根据每户用电量的连续变化规律进行判断.判断方法如下: 在观察期内,若存在超过一半的日子用电量低于某给定的阈值 e,则该住房为"可能空置&quo ...

  9. 开箱即用~基于.NET Core的统一应用逻辑分层框架设计

    目前公司系统多个应用分层结构各不相同,给运维和未来的开发带来了巨大的成本,分层架构看似很简单,但保证整个研发中心都使用统一的分层架构就不容易了. 那么如何保证整个研发中心都使用统一的分层架构,以达到提 ...

  10. 组件的props属性和state状态

    props属性: 我使用代码来说明React中props属性: // Profile.jsx import React from 'react' ; export default Class Prof ...