2021“MINIEYE杯”中國大學生演算法設計超級聯賽(1)1005 Minimum spanning tree
阿新 • • 發佈:2021-07-28
https://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1005&cid=984
題意:
n-1個點,編號為2到n,a和b之間的邊權為lcm(a,b),求最小生成樹
首先從點i連出去的邊權必然大於等於點i
合數向他的因子連邊,邊權為本身是最優的
質數向2連,邊權為2倍的本身
所以最終答案 = 3到n的數的和+3到n的質數和
#include<bits/stdc++.h> using namespace std; #define N 10000001 bool vis[N]; int p[N/10],m; long long sp[N/10作者:xxy 出處:http://www.cnblogs.com/TheRoadToTheGold/ 本文版權歸作者和部落格園共有,轉載請用連結,請勿原文轉載,Thanks♪(・ω・)ノ。]; void pre() { for(int i=2;i<N;++i) { if(!vis[i]) { p[++m]=i; sp[m]=sp[m-1]+p[m]; } for(int j=1;j<=m && p[j]*i<N;++j) { vis[p[j]*i]=true; if(!(i%p[j])) break; } } } int main() { pre();int T,n,b,pos; long long ans; scanf("%d",&T); while(T--) { scanf("%d",&n); ans=1ll*(3+n)*(n-3+1)/2; pos=upper_bound(p+1,p+m+1,n)-p; ans+=sp[pos-1]-2; printf("%lld\n",ans); } }