1. 程式人生 > >【HDU6298】2018杭電多校訓練賽第一場第一題Maximum Multiple 解題報告

【HDU6298】2018杭電多校訓練賽第一場第一題Maximum Multiple 解題報告

題目連結:

題意:

給定一個數n,找出三個正整數x、y和z,滿足:n=x+y+z,x|n,y|n,z|n。然後求xyz的最大值。

輸入:

第一行輸入T,表示多少個測試用例。下面T行,每行輸入一個數n。

輸出:

對於每一個測試用例,輸出一個數,表示xyz的最大值;若不存在這個數,則輸出-1。

分析:

先理解題目中一個數學式子意思:x|n,這個可以參考我的另一篇文章:整除的數學表達

然後知道,n能整除x、y和z,即

然後我們令:r=n/x,s=n/y,t=n/z,又因為:n=x+y+z,所以我們有:1/r+1/s+1/t=1(其中,r,s,t為整數)

那麼我們可以按照這個上面式子得出:1=\frac{1}{3}+\frac{1}{3}+\frac{1}{3}=\frac{1}{2}+\frac{1}{4}+\frac{1}{4}=\frac{1}{2}+\frac{1}{3}+\frac{1}{6}

所以其實r,s,t的解為:3,3,32,4,42,3,6

又:r=n/x,s=n/y,t=n/z,所以對應的x,y和z的三組解:\frac{n}{3},\frac{n}{3},\frac{n}{3}\frac{n}{2},\frac{n}{4},\frac{n}{4}\frac{n}{2},\frac{n}{3},\frac{n}{6}

所以:

  1. 對於第一組解:要求n能被3整除,而xyz的最大值為\frac{n^{3}}{27}
  2. 對於第二組解:要求n能被4整除,而xyz的最大值為\frac{n^{3}}{32}
  3. 對於第三組解:要求n能被6整除,因為第一組是被3整除,所以被6整除一定能被3整除,而且此時的xyz的最大值為\frac{n^{3}}{36},明顯比第一組解的要小,所以第三種情況不用考慮
  4. 最後如果沒有前幾種情況,所以就沒有滿足題目的要求,也就沒有能表示xyz的最大值的數存在,所以輸出-1可以。

AC程式碼:

#include <cstdio>

int main() {
	int T;
	scanf("%d", &T);
	// 因為n是1e6,所以三次方就是1e18,要用long long型 
	for (int cas = 1; cas <= T; ++cas) 
	{
		long long n;
		scanf("%lld", &n);
		if (n % 3 == 0) 
			printf("%lld\n", n * n * n / 27);
		else if (n % 4 == 0) 
			printf("%lld\n", n * n * n / 32);
		else 
			puts("-1");
	}
  	return 0;
}