青云的机房组网方案(简单)
青云现在要将 nn 个机房连成一个互相连通的网络。工程师小王设计出一个方案:通过在 nn 个机房之间铺设 n-1n−1 条双向的光纤,将所有的机房连接。可以假设数据在两个机房之间的光纤传输需要 11 单位时间。每个机房 ii 有一个初始值 a_ia?i??,当两个机房的初始值之间互质时,我们认为这两个机房之间的传输性能是非常重要的。请帮小王计算出所有数值互质的机房对之间的传输时间之和。
输入格式
第一行输入一个正整数 nn,第二行输入 nn 个正整数 a_1...a_na?1??...a?n??,表示 nn 个机房的初始值。
接下来输入 n-1n−1 行,每行输入两个数 a,ba,b,表示机房 aa 和机房 bb 之间有一条双向网络管道。
对于简单版本:n \leq 500n≤500,1 \leq a_i \leq 501≤a?i??≤50;
对于中等版本:n \leq 10000n≤10000, 1 \leq a_i \leq 5001≤a?i??≤500;
对于困难版本:n \leq 100000n≤100000,a_i \leq 100000a?i??≤100000。
输出格式
输出一行,表示所有初始值互质的机房对的传输时间和。
样例输入
4 1 2 3 4 1 2 2 3 3 4
样例输出
8
提示信息
对于第一组样例,每一组初始值互质的机房对的传输时间如下:
(1,2)(1,2):11
(1,3)(1,3):22
(1,4)(1,4):33
(2,3)(2,3):11
(3,4)(3,4):11
所以,所有初始值互质的机房对的传输时间和为 1+2+3+1+1=81+2+3+1+1=8
xyd给我报上这个比赛,结果他自己都不做了,我就做出一个
1 /*floyd算法:直接做就可以了,暴力统计结果*/ 2 #include<iostream> 3 using namespace std; 4 #define N 510 5 long long jz[N][N]; 6 #include<cstdio> 7 #include<cstring> 8 int a[N],n,x,y; 9 int gcd(int b,int c) 10 { 11 if(!c) 12 return b; 13 return gcd(c,b%c); 14 } 15 void input() 16 { 17 scanf("%d",&n); 18 memset(jz,10,sizeof(jz)); 19 for(int i=1;i<=n;++i) 20 { 21 scanf("%d",&a[i]); 22 } 23 for(int i=1;i<=n-1;++i) 24 { 25 scanf("%d%d",&x,&y); 26 jz[x][y]=1;jz[y][x]=1; 27 } 28 } 29 void floyed() 30 { 31 for(int k=1;k<=n;++k) 32 for(int i=1;i<=n;++i) 33 for(int j=1;j<=n;++j) 34 jz[i][j]=min(jz[i][j],jz[i][k]+jz[k][j]); 35 } 36 int main() 37 { 38 input(); 39 floyed(); 40 long long ans=0; 41 for(int i=1;i<=n;++i) 42 for(int j=i+1;j<=n;++j) 43 { 44 if(gcd(a[i],a[j])==1) 45 { 46 ans+=jz[i][j]; 47 } 48 } 49 cout<<ans<<endl; 50 return 0; 51 }
时间: 2024-10-04 07:37:14