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);
    }
}

 

posted @ 2021-07-28 13:58  TRTTG  阅读(62)  评论(0编辑  收藏  举报