描述

尽管付出了种种努力,jzp还是得过光棍节。

jzp非常不爽,但也无能为力,只能够哀叹起来他的命运。他想到了一位长者的人生经验:“人的一生,不光要靠自我奋斗,也要考虑历史的进程”。

他终于明白自己只是时运不济,所以又继续开始努力。终于在圣诞节当天把到了妹子。

jzp从此过上了快乐的现充生活,在圣诞节当天,他还和妹子玩起了有趣的游戏:

jzp的家里有一棵非常大的圣诞树,可以看成是一个n个点的无向联通无环图。每个点上都有一个正整数,JZP和妹子每次都会选择树上的一条路径,

这条路径的权值被定义为路径上所有点上数的最大公约数,JZP可以得到这个权值的分数。

JZP玩了一会儿有点腻了,他想知道对于每种可能的权值x,权值为x的不同路径的数量(a到b的路径和b到a的路径算作一种,a到a自身也算作一条路径。)

输入

第一行一个整数n(1<=n<=105)表示圣诞树的大小,点从1开始标号。

接下来一行n个整数用单个空格隔开,第i个表示第i个点上的数。(数都在1到105之间)。

接下来n-1行,每行两个数a和b,表示a和b之间有一条边。

输出

令C(x)表示权值为x的路径的个数。

从小到大输出对于所有C(x)>0的x,输出一行两个数x和C(x),用空格隔开。

样例输入

20
2 4 2 4 2 4 2 20 20 12 12 12 2 12 2 4 4 2 12 2
1 2
1 3
1 4
2 5
3 6
1 7
6 8
2 9
6 10
5 11
4 12
11 13
10 14
3 15
9 16
7 17
4 18
4 19
16 20

样例输出

2 186
4 16
12 6
20 2 首先考虑将问题转化成计算有多少路径的gcd是k的倍数,然后容斥计算出答案。
注意一条路径的gcd是k的倍数等同于路径每条边gcd的gcd,那么我们预处理出对于每个k有那些边符合要求,就可以计算了。
枚举k,将符合条件的边建出来,可以用个并查集,在合并时顺便计算答案。
需要预处理出每个k的因数,暴力分解会T。
#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=Next[i])
using namespace std;
inline int read() {
int x=,f=;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
}
typedef long long ll;
const int maxn=;
int first2[maxn],Next2[maxn*],id2[maxn*],tot2;
void AddP(int p,int v) {id2[++tot2]=v;Next2[tot2]=first2[p];first2[p]=tot2;}
int first[maxn],Next[maxn*],id[maxn*],tot;
void AddN(int p,int v) {id[++tot]=v;Next[tot]=first[p];first[p]=tot;}
int n,A[maxn],u[maxn],v[maxn],pa[maxn],sz[maxn],S[maxn<<];
int gcd(int a,int b) {return !b?a:gcd(b,a%b);}
int findset(int x) {return pa[x]==x?x:findset(pa[x]);}
ll ans[maxn],res;
void merge(int a,int b) {
int x=findset(a),y=findset(b);
if(x==y) return;
res+=(ll)sz[x]*sz[y];
sz[x]+=sz[y];pa[y]=x;
}
int main() {
n=read();
rep(i,,n) A[i]=read(),pa[i]=i,sz[i]=;
rep(i,,) for(int j=i;j<=;j+=i) AddP(j,i);
rep(i,,n-) {
u[i]=read();v[i]=read();
int x=gcd(A[u[i]],A[v[i]]);
for(int j=first2[x];j;j=Next2[j]) AddN(id2[j],i);
}
dwn(x,,) {
res=;int cnt=;
ren {
merge(u[id[i]],v[id[i]]);
S[++cnt]=u[id[i]];S[++cnt]=v[id[i]];
}
rep(i,,cnt) pa[S[i]]=S[i],sz[S[i]]=;
ans[x]=res;
for(int j=*x;j<=;j+=x) ans[x]-=ans[j];
}
rep(i,,n) ans[A[i]]++;
rep(i,,) if(ans[i]) printf("%d %lld\n",i,ans[i]);
return ;
}

hiho 光棍节的更多相关文章

  1. 11.11光棍节工作心得——github/MVP

    11.11光棍节工作心得 1.根据scrum meeting thirdday中前辈的指导进行学习 我在博客中贴了链接,竟然TrackBack引来了原博主,

  2. hihocoder #1073 : 光棍节

    描述 尽管付出了种种努力,jzp还是得过光棍节. jzp非常不爽,但也无能为力,只能够哀叹起来他的命运.他想到了一位长者的人生经验:"人的一生,不光要靠自我奋斗,也要考虑历史的进程" ...

  3. ABBYY FineReader去他的光棍节,我要我的双十一

    今天就是双十一,全民剁手的双十一,一年仅一次的双十一,不只是半价的双十一.....此时此刻,多少钱拿起手机在疯狂购物,又有多少人死守着电脑,不敢怠慢一丁点机会,买着买着购物车就空了,然后才发现,咦!超 ...

  4. 光棍节程序员闯关秀writeup

    答题链接https://1111.segmentfault.com/ 第一关 首先当然是右键查看源码啊 点击链接进入下一关 第二关 还是老样子,右键查看源码 这个key是要放在URL链接里敲回车的 第 ...

  5. 11月11日光棍节考试总结hhh

    好吧,第一题字符串裸栈就能A 第二题字典序没调完,先写的第一题和第三题暴力,第二题读题感觉自己不会写,其实也能写出来,浪费了好多时间 第三题DP大概是写的暴力,原本可以搞到20分,要交的时候发现自己少 ...

  6. NYOJ-451-光棍节的快乐

    光棍节的快乐 时间限制:1000 ms  |  内存限制:65535 KB 难度: 描写叙述 光棍们,今天是光棍节.聪明的NS想到了一个活动来丰富这个光棍节. 规则例如以下: 每一个光棍在一个纸条上写 ...

  7. “老坛泡新菜”:SOD MVVM框架,让WinForms焕发新春

    火热的MVVM框架 最近几年最热门的技术之一就是前端技术了,各种前端框架,前端标准和前端设计风格层出不穷,而在众多前端框架中具有MVC,MVVM功能的框架成为耀眼新星,比如GitHub关注度很高的Vu ...

  8. quartz CronExpression表达式

    一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素.按顺序依次为1.秒(0~59)2.分钟(0~59)3.小时(0~23)4.天(月)(0~31,但是你需要考虑你月的天数)5.月(0~11 ...

  9. [JAVA]定时任务之-Quartz使用篇

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个, ...

随机推荐

  1. 又一款linux提权辅助工具

    又一款linux提权辅助工具 – Linux_Exploit_Suggester 2013-09-06 10:34 1455人阅读 评论(0) 收藏 举报 https://github.com/Pen ...

  2. php __set() __get() __isset() __unset()四个方法的应用

    一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是,对属性的读取 和赋值操作是非常频繁的,因此在PHP5 中,预定义了两个函数“__get()”和“__set()”来获 取和赋值其 ...

  3. 【云计算】Dockerfile示例模板

    Dockerfile FROM debian:jessie MAINTAINER "Konrad Kleine" USER root ####################### ...

  4. js 实现图片预加载 (js操作 Image对象属性complete ,事件onload 异步加载图片)

    通过js操纵DOM很多情况下都是为了实现和当前页html元素的异步载入,我谈谈对Image对象的一些认识.看个例子:<input type="button" name=&qu ...

  5. k Sum | & ||

    k Sum Given n distinct positive integers, integer k (k <= n) and a number target. Find k numbers ...

  6. ali2015校园招聘笔试大题

    [本文链接] http://www.cnblogs.com/hellogiser/p/ali-2015-questions.html 1. 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函 ...

  7. [MACOS] Mac上的抓包工具Charles

    转载自: http://blog.csdn.net/jiangwei0910410003/article/details/41620363 今天就来看一下Mac上如何进行抓包,之前有一篇文章介绍了使用 ...

  8. 安卓通过putExtra传递数据的几种方式

    通过intent传递数据时,使用以下代码报错: hMap<string, object=""> map=(Map<string, object="&qu ...

  9. coalesce

    coalesce我理解就是将多个partition合并成少量的partition. data.coalesce(2,true) 第一个参数是partition数量 第二个参数是合并是是否进行shuff ...

  10. 使用Javascript无限添加QQ好友原理解析

    做QQ营销的朋友都知道,QQ加好友是有诸多限制的,IP限制,次数限制,二维码限制,人数限制,使用软件自动加好友会遇到各种各样的问题,很多软件通过模拟人工添加QQ号码,在添加几个之后就会遇到腾讯规则限制 ...