题意
给一个数正整数 n n n,问是否存在三个数 x , y , z , x,y,z, x,y,z, 他们能整除 n n n且 x + y + z = n x+y+z=n x+y+z=n。如果不存在输出 − 1 -1 −1,否则输出 x × y × z x\times y \times z x×y×z,如果有多个值,输出最大的那个。
分析
这个我们可以枚举几个例子,首先 n n n最小从3开始
n n n | x x x | y y y | z z z |
---|---|---|---|
3 | 1 | 1 | 1 |
4 | 2 | 2 | 2 |
6 | 2 | 2 | 2 |
8 | 4 | 2 | 2 |
9 | 3 | 3 | 3 |
12 | 4 | 4 | 4 |
12 | 6 | 3 | 3 |
初步的分析我们可以得到 n n n必然只能拆分成 1 + 1 + 1 1+1+1 1+1+1或者 1 + 1 + 2 1+1+2 1+1+2的形式。因为题目要求乘积最大,当然是三个数越接近越好。如果 n n n能被3整除,那么我们令 x = y = z = 商 x=y=z=商 x=y=z=商是最好的情况,如果 n n n不能被3整除,那么也要尽量让这三个数接近。假设 k k k是 x , y , z x,y,z x,y,z的最大公因数,如果 n n n可以拆分成 k ( 1 + 2 + 3 ) k(1+2+3) k(1+2+3)的形式,我们自然可以变成 k ( 2 + 2 + 2 ) k(2+2+2) k(2+2+2)这样又回到了原来的1+1+1;如果是 k ( 1 + 2 + 2 ) k(1+2+2) k(1+2+2)的话 n n n又是不能整除 2 k 2k 2k的。这样推过几轮以后我们可以发现只有上述的这两种情况.
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
ll a;
scanf("%lld",&a);
if (a%3==0)
{
printf("%lld\n",a*a*a/27);
}
else if (a%4==0)
{
printf("%lld\n",a*a*a/32);
}
else
{
printf("-1\n");
}
}
return 0;
}