【HDU6298】2018杭电多校训练赛第一场第一题Maximum Multiple 解题报告

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=6298

题意:

给定一个数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;
}

猜你喜欢

转载自blog.csdn.net/mikchy/article/details/81190709