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); } }
新 blog : www.hrwhisper.me