题目链接:
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,s,t为整数)
那么我们可以按照这个上面式子得出:
所以其实r,s,t的解为:3,3,3和2,4,4和2,3,6
又:,所以对应的x,y和z的三组解:、和
所以:
- 对于第一组解:要求n能被3整除,而xyz的最大值为
- 对于第二组解:要求n能被4整除,而xyz的最大值为
- 对于第三组解:要求n能被6整除,因为第一组是被3整除,所以被6整除一定能被3整除,而且此时的xyz的最大值为,明显比第一组解的要小,所以第三种情况不用考虑
- 最后如果没有前几种情况,所以就没有满足题目的要求,也就没有能表示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;
}