UVA 10791 - Minimum Sum LCM

看题传送门


看了大神的思路才做出来的。数学弱爆了T T

题目要求是至少两个正整数,是至少!

那么何时有最优解呢?

由唯一分解定理:(每个大于1的自然数均可写为质数的积,而且这些素因子按大小排列之后,写法仅有一种方式。)

n = p1^(n1 ) * p2^(n2) * ... * pn^(nn)

也就是说这里的n可以被拆分成上式。

要使和最小,那么就是求p1^(n1 ) + p2^(n2) + ... + pn^(nn)

为什么呢?当a,b均大于2时有a * b > a+ b  (均等于2为等号)

那为什么是素因子的次方呢?

如果不同的素因子组成一个约数的话,那么lcm就不会是n,会小于。(LCM=A*B/GCD,如果GCD不为1,那么LCM会变小)

举个例子,n=72时候,n=2^3 * 3^2

如果2和3组成一个约数a比如6,它和12组成的LCM就是12不会是72,

只有当8和9时才会是。(不可约 LCM=A*B/GCD)

再比如4和6的最小公倍数为12,不是24,因为4=2*2,6=2*3,要8=2^3,3=3^1就可以。

 

本题需要注意的是

1、n为素数或者1,答案都是n+1(y只有1和n的LCM才是n)

2、只能分解成一个素因子的,也为n+1比如4=2*2,如果都取2显然LCM为2,只能1和4答案是5。 121同样道理只能分解11 答案122

3、用long long 保存。


#include<cstdio>
#include<cmath>
int main()
{
	int n,ri=1;
	while(scanf("%d",&n),n)
	{
		long long sum=0,temp;
		int l=sqrt(n),cnt=0;
		for(int i=2;i<=l;i++)
		{

			if(n%i==0)
			{
				temp=1;
				cnt++;
				while(n%i==0)
				{				
					temp=(long long ) temp* i;
					n/=i;				
				}
				sum+=temp;
			}
		}	
		if( n !=1 ||0 == cnt)
		{
			sum+=n;
			cnt++;
		}
		if(1 == cnt)
			sum++;
		printf("Case %d: %lld\n",ri++,sum);
	}
}


 

posted @ 2013-08-10 23:21  hr_whisper  阅读(159)  评论(0编辑  收藏  举报