2021“MINIEYE杯”中国大学生算法设计超级联赛(1)1005 Minimum spanning tree
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]; 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); } }