Minimum spanning tree(素数筛+思维)

  • Post author:
  • Post category:其他


在这里插入图片描述


题意:给定 n-1 个点,编号从 2 到 n,两点 a 和 b 之间的边权重为 lcm(a, b)。 请找出它们形成的最小生成树。 lcm(a, b) 是能被 a 和 b 整除的最小正整数。求即最小生成树边缘权重和。



题解:可以将所有数分为质数点和合数点,当一个数为质数点的时候,最小公倍数为两个数的乘积,为了使权重和最小,故另一个数为最小值2,。当该数为合数的时候,最小公倍数最小为当前的合数,所以最后的答案为素数*2+合数。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1e7 + 5;
const int mod = 1e9 + 7;
int a[maxn], prime[maxn], isprime[maxn];
int num = 1;
void s() {
	for (int i = 2; i < maxn; i++) {
		if (!isprime[i]) prime[num++] = i;
		for (int j = 1; j <= num && i * prime[j] < maxn; j++)

		{
			isprime[prime[j]*i] = 1;
			isprime[prime[j]*i] = 1;
			if (i % prime[j] == 0) break;
		}

	}

}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin >> t;
	s();
	for (int i = 3; i <= maxn; i++) {
		if (isprime[i]) a[i] = a[i - 1] + i;
		else a[i] = a[i - 1] + 2 * i;
	}
	while (t--) {
		//TODO
		int n;
		cin >> n;

		cout << a[n] << endl;
	}

}



版权声明:本文为weixin_52513845原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。