最小公倍数和数论——UVa10791-Minimum Sum LCM

大致题意

给定一个1e10以内的正整数a,试着求初出这样一串数列,它们的最小公倍数为a,输出这个数列元素和的最小值(元素数量至少为2)。

解题思路

很明显最终答案的元素中,任意两个元素的最大公约数都要是1,否则肯定存在另一个和更加小的数列,所以当我们把a分解成多个质数相乘时,必须要把相同的数乘在一起合并为一个数,另外还要处理一些特殊情况比如a=1,a为质数等等。

AC代码

#include<iostream>
#define ll long long
using namespace std;
int main() {
	ll int a,ans1,ans2,b=1,i,N,pan;
	while(1) {
		scanf("%lld",&a);
		ans1=0; ans2; pan;
		N=a;
		if(a==0) break;
		for(i=2;i<=a;i++) {
			pan=0;
			for(;i*i<a;i++) {
				if(a%i==0) {
					pan=1;
					break;
				}
			}
			if(pan==1) {
				a=a/i;
				ans2=i;
				for(;;) {
					if(a%i==0&&a>=2) {
						a=a/i;
						ans2=ans2*i;
					}
					if(a%i!=0||a<2) break;
				}
				ans1=ans1+ans2;
			}
			else {
				ans1+=a;
				break;
			}
		}
		if(ans1==N) ans1++;
		if(N==1) ans1=2;
		printf("Case %d: %lld\n",b++,ans1);
	}
}

猜你喜欢

转载自blog.csdn.net/littlewhitelv/article/details/80290778