題目大意:
輸入正整數n,(n<=2^31-1),找到至少兩個正整數,使得它們的LCM(最小公倍數)為n,並且和最小。
思路:
分解質因子,把各個質因子的相應次方加起來就是答案。
(下面摘自http://blog.csdn.net/xuruoxin/article/details/8847987 首先題意是把多個數的最小公倍數為N的數相加和最小即為答案,注意不是2個,一開始想當然的以為求出所有素數次方分2半求最小和。 這裡是素數次方和,也就是pn^nn的和 這樣既然是多個數,多少個數的時候最小呢? a * b > a+ b (a, b > 2) 這是必然的吧 。 所以只要把沒中素數的n次方相加就行了。 為什麼這樣可以呢,證明下:
如果不是這樣的,n個數相加,其中有2個數享有同一種n的素數,那求最小公倍數的是是可以約去的。。。比如 4, 6 的最小公倍數是12 然而, 4和6都有2為公約數,所以可以約去後再相乘就是最小公倍數了,所以不能同時享有,則可以把 6中的2除去,也就是6/2=3 又 3 和 4的最小公倍數是12. 這裡也不能除以4裡的2, 這很明顯,如果除的話,要不斷的除直到4 變為1 而 1和6最小公倍數就是6了。。為什麼會這樣呢? 因為4是由2^2 構成的 而6是2*3 所以。。也就是說同一種N的素數次方構成的為一個數之後求和)
注意的是直接2到n會TLE
2^31-1=2147483647為素數,要用long long 來存,
n為素數答案為n+1,
當只有單質因子時,答案為質因子相應次方+1;
#includetypedef long long LL; int main() { LL n,kase=1; while(~scanf(%lld,&n),n) { LL ans=0,cnt=0,x=n; for(LL i=2;i*i<=n;i++) { LL temp=1; if(n%i==0) { cnt++; while(n % i==0) { n/=i; temp*=i; } ans+=temp; } } if(n==x) //素數 ans=x+1; else if(n!=1 || cnt==1) //n為單因子或者沒除完。 ans+=n; printf(Case %lld: %lld ,kase++,ans); } return 0; }