程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> UVA 10791 - Minimum Sum LCM

UVA 10791 - Minimum Sum LCM

編輯:C++入門知識

 

題目大意:

輸入正整數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;

 

 

#include
typedef 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;
}


 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved