题目大意

给定一棵树,每个点有点权,求有多少组点对满足两点简单路径上的所有点点权的$gcd=1$。

$n,val_i\leq 10^5$

题解

考虑设$G_i$表示简单路径上所有点点权均为$i$的倍数的点对数。

那么最终答案显然就是$\sum G_i \mu(i)$。

由于求$gcd$,那么点权某一个质因子次数大于$2$是没有意义的,所以$val$最多有$6$个质因子

$(2\times 3\times 5\times 7\times 11\times 13=30030)$。

那么一个数的约数不超过$64$个,那么开$n$个$vector$,$vector_i$存点权是$i$倍数的点的集合。

若求$G_i$,只需要求全部由$vector_i$中的点组成的路径数即可。

那么将这若干个点取出来,在原树构成若干个连通块,那么每一个连通块内任意两点组成路径均能贡献,则答案$=\frac{n(n-1)}{2}$。

最后再求与莫比乌斯函数的点积之和即可。

#include<bits/stdc++.h>
#define debug(x) cerr<<#x<<" = "<<x
#define sp <<" "
#define el <<endl
#define LL long long
#define M 100020
using namespace std;
namespace IO{
const int BS=(1<<20)+5; char Buffer[BS],*HD,*TL;
char Getchar(){if(HD==TL){TL=(HD=Buffer)+fread(Buffer,1,BS,stdin);} return (HD==TL)?EOF:*HD++;}
int read(){
int nm=0,fh=1; char cw=Getchar();
for(;!isdigit(cw);cw=Getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=Getchar()) nm=nm*10+(cw-'0');
return nm*fh;
}
}using namespace IO;
int sz[M],n,m,fs[M],nt[M<<1],to[M<<1],val[M],tmp; vector<int>G[M];
int p[M],tot,mu[M],vis[M]; bool isp[M]; LL ans;
#define link(a,b) nt[tmp]=fs[a],fs[a]=tmp,to[tmp++]=b
void init(){
memset(isp,true,sizeof(isp)),mu[1]=1,isp[1]=false;
for(int i=2;i<M;i++){
if(isp[i]) p[++tot]=i,mu[i]=-1;
for(int j=1;p[j]*i<M&&j<=tot;j++){
isp[p[j]*i]=false;if(i%p[j]==0) break;mu[p[j]*i]=-mu[i];
}
}
}
void dfs(int x,int last,int num){
vis[x]=num,sz[x]=1;
for(int i=fs[x];i!=-1;i=nt[i]){
if(to[i]==last||val[to[i]]%num) continue;
dfs(to[i],x,num),sz[x]+=sz[to[i]];
}
}
void solve(int num,LL res=0){
for(int k=0,TT=G[num].size();k<TT;k++){
int x=G[num][k];
if(vis[x]==num) continue;
dfs(x,0,num),res+=((LL)sz[x]*(LL)(sz[x]-1))>>1;
} if(res) ans+=mu[num]*res;
}
int main(){
init(),n=read(),memset(fs,-1,sizeof(fs));
for(int i=1;i<n;i++){int x=read(),y=read();link(x,y),link(y,x);}
for(int i=1;i<=n;i++){
val[i]=read();
for(int j=1;p[j]*p[j]<=p[i];j++) while(val[i]%(p[j]*p[j])==0) val[i]/=p[j];
for(int j=1;j*j<=val[i];j++){
if(val[i]%j) continue; G[j].push_back(i);
if(j*j<val[i]) G[val[i]/j].push_back(i);
}
}
for(int i=1;i<M;i++) solve(i); printf("%lld\n",ans); return 0;
}

NOIP模拟题 友好国度的更多相关文章

  1. 【入门OJ】2003: [Noip模拟题]寻找羔羊

    这里可以复制样例: 样例输入: agnusbgnus 样例输出: 6 这里是链接:[入门OJ]2003: [Noip模拟题]寻找羔羊 这里是题解: 题目是求子串个数,且要求简单去重. 对于一个例子(a ...

  2. NOIP模拟题汇总(加厚版)

    \(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...

  3. 9.9 NOIP模拟题

    9.9 NOIP模拟题 T1 两个圆的面积求并 /* 计算圆的面积并 多个圆要用辛普森积分解决 这里只有两个,模拟计算就好 两圆相交时,面积并等于中间两个扇形面积减去两个三角形面积 余弦定理求角度,算 ...

  4. 8.22 NOIP 模拟题

      8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...

  5. NOIP模拟题17.9.26

    B 君的任务(task)[题目描述]与君初相识,犹如故人归.B 君看到了Z 君的第一题,觉得很难.于是自己出了一个简单题.你需要完成n 个任务,第i 任务有2 个属性ai; bi.其中ai 是完成这个 ...

  6. noip模拟题题解集

    最近做模拟题看到一些好的题及题解. 升格思想: 核电站问题 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定 ...

  7. NOIP 模拟题

    目录 T1 : grid T2 : ling T3 : threebody 数据可私信我. T1 : grid 题目:在一个\(n*n\)的方格中,你只能斜着走.为了让问题更简单,你还有一次上下左右走 ...

  8. 9.22 NOIP模拟题

    吉林省信息学奥赛 2017 冬令营                                                                                    ...

  9. 6.19 noip模拟题(题目及解析转自 hzwer 2014-3-15 NOIP模拟赛)

    Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序 ...

随机推荐

  1. canvas 事件绑定

    Canvas事件绑定   canvas事件绑定 众所周知canvas是位图,在位图里我们可以在里面画各种东西,可以是图片,可以是线条等等.那我们想给canvas里的某一张图片添加一个点击事件该怎么做到 ...

  2. 微信小程序获取验证码倒计时

    getVerificationCode: function() { var that = this; var currentTime = that.data.currentTime; that.set ...

  3. 《React-Native系列》RN与native交互与数据传递

    RN怎么与native交互的呢? 下面我们通过一个简单的Demo来实现:RN页面调起Native页面,Native页面选择电话本数据,将数据回传给RN展示. 首先是 Native侧 1.MainAct ...

  4. 启动工程Ehcache报错

    缓存组建用的Ehcache,在启动的时候报了下面的错误,虽然不影响使用,看着还是有点碍眼:   DEBUG net.sf.ehcache.util.UpdateChecker - Update che ...

  5. 用WAR的方式部署SpringBoot项目

    接SpringBoot 快速入门(Eclipse) 步骤一:部署方式 Springboot 和 web 应用程序不一样,其本质上是一个 Java 应用程序,那么又如何部署呢? 通常来说,Springb ...

  6. LeetCode——Max Consecutive Ones

    LeetCode--Max Consecutive Ones Question Given a binary array, find the maximum number of consecutive ...

  7. quartz(8)--其他

    JOB并发执行 Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行, 如果定时任执行太长,会长时间占用资源,导致其它任务堵塞. 设置为非并发 1)Job类加上注 ...

  8. IE10下阿里旺旺无法快速登录解决办法

    一直都是用Chrome浏览器的,如果已经登录了旺旺,打开淘宝登录的时候都是会有快速登录的,免得手工输入用户名密码了.不经意间用IE10打开淘宝,登录时发现无法使用快速登录,一番研究后发现,IE做了保护 ...

  9. include,include_once,require,require_once的区别

    1.include() include(/path/to/filename) include()语句将在其被调用的位置处包含一个文件.包含一个文件与在该语句所在位置复制制定文件的数据具有相同内容的效果 ...

  10. day5-time & datetime模块

    1.概述 程序设计开发过程中,往往存在很多场景,需要把时间和日期以某种特定形式格式化输出,在python中我们需要借助time & datetime模块来实现,今天就来一探这两大模块的究竟. ...