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=0,f=1;char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘;
    return x*f;
}
typedef long long ll;
const int maxn=100010;
int first2[maxn],Next2[maxn*20],id2[maxn*20],tot2;
void AddP(int p,int v) {id2[++tot2]=v;Next2[tot2]=first2[p];first2[p]=tot2;}
int first[maxn],Next[maxn*20],id[maxn*20],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<<1];
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,1,n) A[i]=read(),pa[i]=i,sz[i]=1;
    rep(i,1,100000) for(int j=i;j<=100000;j+=i) AddP(j,i);
    rep(i,1,n-1) {
        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,100000,1) {
        res=0;int cnt=0;
        ren {
            merge(u[id[i]],v[id[i]]);
            S[++cnt]=u[id[i]];S[++cnt]=v[id[i]];
        }
        rep(i,1,cnt) pa[S[i]]=S[i],sz[S[i]]=1;
        ans[x]=res;
        for(int j=2*x;j<=100000;j+=x) ans[x]-=ans[j];
    }
    rep(i,1,n) ans[A[i]]++;
    rep(i,1,100000) if(ans[i]) printf("%d %lld\n",i,ans[i]);
    return 0;
}

时间: 2024-10-15 04:03:03

hiho 光棍节的相关文章

hihoCoder挑战赛4 光棍节

题目3 : 光棍节 时间限制:30000ms 单点时限:1000ms 内存限制:256MB 描述 尽管付出了种种努力,jzp还是得过光棍节. jzp非常不爽,但也无能为力,只能够哀叹起来他的命运.他想到了一位长者的人生经验:“人的一生,不光要靠自我奋斗,也要考虑历史的进程”. 他终于明白自己只是时运不济,所以又继续开始努力.终于在圣诞节当天把到了妹子. jzp从此过上了快乐的现充生活,在圣诞节当天,他还和妹子玩起了有趣的游戏: jzp的家里有一棵非常大的圣诞树,可以看成是一个n个点的无向联通无环

光棍节程序员闯关秀(总共10关)

程序员闯关大挑战: https://1111.segmentfault.com/ 仓鼠演示7k7k.4399小游戏: http://cdn.abowman.com/widgets/hamster/hamster.swf 第一关 提示: 从所有信息中找到进入下一关的方法 这一关很简单,即使没有任何web知识也能轻松通过.只要你懂得晃鼠标~~ 查看源代码会发现有这么一行: <p><astyle="color: #172024"href="?k=7a2546077

光棍节的快乐 NYOJ 451

#include<stdio.h>//光棍节的快乐(451) long long f(int x) { long long res=1,i; for(i=1;i<=x;i++){ res=res*i; } return res; } long long g(int x) { if(x==2)return 1; else if(x==3)return 2; else return (x-1)*(g(x-1)+g(x-2)); } int main() { long long m,n,t,r

光棍节的快乐

光棍节的快乐 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 光棍们,今天是光棍节.聪明的NS想到了一个活动来丰富这个光棍节. 规则如下: 每个光棍在一个纸条上写一个自己心仪女生的名字,然后把这些纸条装进一个盒子里,这些光 棍依次抽取一张纸条,如果上面的名字就是自己心仪的女生,那么主持人就在现场给该女生打电话,告诉这个光棍对她的爱慕之情,并让光棍当场表白,并得到现场所有人的祝福,没抽到的,嘿嘿就可以幸免了. 假设一共有N个光棍,其中有M个没有抽到自己的纸条,求发生这

光棍节程序员闯关秀writeup

答题链接https://1111.segmentfault.com/ 第一关 首先当然是右键查看源码啊 点击链接进入下一关 第二关 还是老样子,右键查看源码 这个key是要放在URL链接里敲回车的 第三关 根据前两关这个难度,第三关估计在请求头或者响应头里,先开burp 刷新,拦截返回包 拿到flag 第四关 根据前几次规律,都是在改k的参数 对他进行MD5解码 明文是4,这又是第4关,猜测第五关是5的MD5 第五关 扫码,发现什么都没有 难倒是图片隐写术?上工具 得到key 第六关 给我的感觉

光棍节的表白句子说说,光棍节的由来

光棍节的说说 摘要:情侣们可以把每一个节日都过成情人节,单身们可以把每一个节日都过成光棍节. 1.那些暗恋我的人啊,你们怎么那么沉得住气啊! 2.其实我过不过光棍节无所谓,只要我喜欢的人也过光棍节就好了. 3.光棍节在家玩连连看,然后一对一对的消灭你们. 4.对于光棍而言,光棍节就好像大姨妈一样,来一次痛一次. 5.光棍节让我一个人过,情人节让我一个人过,平安夜让我一个人过,圣诞节让我一个人过,有本事考试也让我一个过啊! 6.有没有人和我一样,每次都过光棍节,但也每次错过情人节. 7.有人问我光

程序员的光棍节 你懂吗

每到11.11,大家第一个反应就是天猫的双11,但是可别忘了,最最开始这可代表着光棍节啊! 其实,小编是直到大学才知道有这么个节日的存在,那个时候一定也不放在心上,"妹子是什么,能和我打魔兽玩DOTA不?"大学毕业之后,这个节日慢慢演变成了疯狂购物节,小编就更没啥想法了"因为偶不是剁手党哦!".但是现在,看到身边渐渐地都开始成双入对,突然觉得今天貌似有点寂寞啊! 唉,可怜滴骚年啊! --没有女朋友的,到底是要过光棍节呢,还是要过(guang)双(gun)十(jie)

光棍节脱单,单身狗该你上了

11.11---  一年一度的光棍节到了,又到了装逼的最佳时间. 光棍节是单身狗的硬伤,同时也是已婚男淫最害怕过的节日. 女人这个动物,据说她们非常善良,喜欢养小动物,什么捷豹呀,悍马,路虎,当然还有天猫. 这TM前提是你得有一个女朋友.没女朋友你说个毛啊? 对于屌丝没有女朋友,我深深地表示↓↓↓↓↓ 双十一,弱弱的问一句,你想脱单吗? 来兄弟连学习云计算架构湿吧! 架构湿,湿湿de,单身狗值得拥有. 来兄弟连学习你就可以实现骚动的梦想. 因为,他们都拿到了 高薪.高薪.高薪 对于从兄弟连毕业拿

光棍节,兄弟连UI学科带你装逼带你飞!

自盘古开天辟地万物成形,男人出现不久,一种叫"女人"的生物也顺应而生,万万没想到啊,女人修炼到最后会变成一种称为"丈母娘"的终极体--如何搞定大BOSS丈母娘,经兄弟连各位老师前仆后继奋不顾身的实践,终于获得最深奥义:先搞定女朋友,丈母娘发什么大招都是浮云! 男人,除了要对自己狠一点,谈恋爱这回事,最重要的是比翼双飞,世界上最远的距离不是异地恋,而是妹子在试新内衣你却认真的看代码--女人,是一种神奇的生物,她跑步可能跑不过你,但是逛街你一定不是她的对手:女人也不是不