gcd的最小生成树

牛客暑期训练 6 E

阿宁有一个n个节点的完全图,编号从1到n。对于点i和点j(i<j),如果j−i≤k,那么j之间有一条边权为lcm(i,j)的边,否则有一条边权为
gcd(i,j)的边。

阿宁想求出该完全图的最小生成树。

思路:所有节点与1的lcm为其本身i,与1的gcd为1.(一个数和质数的gcd也为1).

对所有i<k+1的节点,寻找j-i>k的j节点的gcd小于i的值。

#include<iostream>

using namespace std;

typedef long long ll;

int gcd(int a,int b)
{
    if(b==0) return a;
    return gcd(b,a%b);
}

int main()
{
    int n,k;
    cin>>n>>k;
    
    ll ans=n-min(n,k+1);
    
    for(int i=2;i<=min(n,k+1);i++)
    {
        int tmp=i;
        for(int j=i+1+k;j<=n;j++)
        {
            tmp=min(tmp,gcd(j,i));
            if(tmp==1) break;
        }
        ans+=tmp;
    }
    
    cout<<ans;
    return 0;
}
posted on 2023-02-10 11:10  rain_wind_read  阅读(71)  评论(0编辑  收藏  举报