hiho 光棍节
描述
尽管付出了种种努力,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 光棍节的更多相关文章
- 11.11光棍节工作心得——github/MVP
11.11光棍节工作心得 1.根据scrum meeting thirdday中前辈的指导进行学习 我在博客中贴了链接,竟然TrackBack引来了原博主,
- hihocoder #1073 : 光棍节
描述 尽管付出了种种努力,jzp还是得过光棍节. jzp非常不爽,但也无能为力,只能够哀叹起来他的命运.他想到了一位长者的人生经验:"人的一生,不光要靠自我奋斗,也要考虑历史的进程" ...
- ABBYY FineReader去他的光棍节,我要我的双十一
今天就是双十一,全民剁手的双十一,一年仅一次的双十一,不只是半价的双十一.....此时此刻,多少钱拿起手机在疯狂购物,又有多少人死守着电脑,不敢怠慢一丁点机会,买着买着购物车就空了,然后才发现,咦!超 ...
- 光棍节程序员闯关秀writeup
答题链接https://1111.segmentfault.com/ 第一关 首先当然是右键查看源码啊 点击链接进入下一关 第二关 还是老样子,右键查看源码 这个key是要放在URL链接里敲回车的 第 ...
- 11月11日光棍节考试总结hhh
好吧,第一题字符串裸栈就能A 第二题字典序没调完,先写的第一题和第三题暴力,第二题读题感觉自己不会写,其实也能写出来,浪费了好多时间 第三题DP大概是写的暴力,原本可以搞到20分,要交的时候发现自己少 ...
- NYOJ-451-光棍节的快乐
光棍节的快乐 时间限制:1000 ms | 内存限制:65535 KB 难度: 描写叙述 光棍们,今天是光棍节.聪明的NS想到了一个活动来丰富这个光棍节. 规则例如以下: 每一个光棍在一个纸条上写 ...
- “老坛泡新菜”:SOD MVVM框架,让WinForms焕发新春
火热的MVVM框架 最近几年最热门的技术之一就是前端技术了,各种前端框架,前端标准和前端设计风格层出不穷,而在众多前端框架中具有MVC,MVVM功能的框架成为耀眼新星,比如GitHub关注度很高的Vu ...
- quartz CronExpression表达式
一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素.按顺序依次为1.秒(0~59)2.分钟(0~59)3.小时(0~23)4.天(月)(0~31,但是你需要考虑你月的天数)5.月(0~11 ...
- [JAVA]定时任务之-Quartz使用篇
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个, ...
随机推荐
- django-jinjia 集成
现成包可以参考这里: http://niwibe.github.io/django-jinja/ Requirements Python 2.7, 3.3 or 3.4 Django 1.4, 1. ...
- php获取网页内容方法总结
抓取到的内容在通过正则表达式做一下过滤就得到了你想要的内容,至于如何用正则表达式过滤,在这里就不做介绍了,有兴趣的,以下就是几种常用的用php抓取网页中的内容的方法. 1.file_get_conte ...
- ORM框架是什么
ORM框架是什么 对象关系映射,目前数据库是关系型数据库 ORM 主要是把数据库中的关系数据映射称为程序中的对象 目前集中常见的ORM框架1 Nhibernate原因:用的比较多,资料也比较好找. ...
- Word Pattern | & II
Word Pattern | Given a pattern and a string str, find if str follows the same pattern. Examples: pat ...
- 【转】 JSONObject使用方法
随笔- 46 文章- 0 评论- 132 JSONObject简介 本节摘要:之前对JSON做了一次简单的介 绍,并把JSON和XML做了一个简单的比较:那么,我就在想,如果是一个json格式的字 ...
- web iphone css 兼容性
解决IPHONE网页兼容(部分字号变大): body{-webkit-text-size-adjust:none;}
- javascript首尾反转字符
var my_str="Welcome to www.sharejs.com" var i=my_str.length; i=i-1; for (var x = i; x > ...
- Power Strings(poj 2406)
题意:求字符串中循环节出现的次数 KMP!!! #include<cstdio> #include<iostream> #include<cstring> #def ...
- p188习题2
- tcp连接管理
[root@ok etc]# cat /proc/sys/net/core/netdev_max_backlog 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目 ...