Minimum Sum LCM

UVA10791
在这里插入图片描述

思路
N = l c m ( a , b ) = a b g c d ( a , b ) N=lcm(a,b)=\frac{ab}{gcd(a,b)} 可知,当且仅当 g c d ( a , b ) = 1 gcd(a,b)=1 时, a + b a+b 的值最小。因为若 g c d ( a , b ) > 1 gcd(a,b)>1 ,则有:
l c m ( a , b ) = a b g c d ( a , b ) = a g c d ( a , b ) b 1 lcm(a,b)=\frac{ab}{gcd(a,b)}=\frac{\frac{a}{gcd(a,b)}b}{1}
此时, a g c d ( a , b ) + b < a + b \frac{a}{gcd(a,b)}+b<a+b ,结论即证。
那么,目标就变成了将 N N 分解为若干素数。
由唯一分解定理:
N = i = 1 n p i a i , p N=\sum\limits_{i=1}^{n}p_i^{a_i},p为素数
即N可被唯一分解为若干素数的积。
那么答案是否就是 i = 1 n ( a i p i ) \sum\limits_{i=1}^{n}(a_ip_i) 了呢?
l c m ( p , p ) = p lcm(p,p)=p 可知,若将若干个 a a 直接加入集合,那么该集合的 l c m = i = 1 n p i N lcm=\sum\limits_{i=1}^{n}p_i\neq N
那咋办呢?由唯一分解定理, N = i = 1 n p i a i N=\sum\limits_{i=1}^{n}p_i^{a_i} ,其中由于 p p 是素数,所以对于任意的 1 i , j n , i j 1\leq i,j\leq n,i\neq j ,有 p i a i p_i^{a_i} p j a j p_j^{a_j} 互质。
因此答案为: i = 1 n ( p i a i ) \sum\limits_{i=1}^{n}(p_i^{a_i})
一个用于优化的定理:对于正整数 N N ,至多只存在一个 N N 的素因子 P P ,使得 P > N P>\sqrt{N}
代码

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

int main(){

	int Case = 0, n;
	while (cin >> n && n) {
		int Max = ceil(sqrt(n));
		long long Ans = 0;
		int NumberOfDifferentPrimeFactor = 0;
		//枚举素数2到Max
		for (int i = 2; i <= Max; ++i) {
			if (n % i == 0) {
				++NumberOfDifferentPrimeFactor;
				int temp = 1;
				while (n % i == 0) {
					n /= i;
					temp *= i;
				}
				Ans += temp;
			}
		}
		//如果N是素数或1,答案就是1+n
		if (NumberOfDifferentPrimeFactor == 0) {
			Ans = static_cast<long long>(n) + 1;
		}
		//N至少被分解为两个素因子且N至多只存在至多一个大于Max的素因子
		//因此只处理了一个或n>1就要再处理
		else if (NumberOfDifferentPrimeFactor == 1 || n != 1) {
			Ans += n;
		}
		printf("Case %d: %lld\n", ++Case, Ans);
	}

	return 0;

}
发布了71 篇原创文章 · 获赞 80 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42971794/article/details/104618014