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
",ans);
    }
}
作者:xxy
本文版权归作者和博客园共有,转载请用链接,请勿原文转载,Thanks♪(・ω・)ノ。
原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/15070152.html