题意
给一个数正整数 nnn,问是否存在三个数x,y,z,x,y,z,x,y,z, 他们能整除nnn且x+y+z=nx+y+z=nx+y+z=n。如果不存在输出−1-1−1,否则输出x×y×zx\times y \times zx×y×z,如果有多个值,输出最大的那个。
分析
这个我们可以枚举几个例子,首先nnn最小从3开始
| nnn | xxx | yyy | zzz |
|---|---|---|---|
| 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 |
初步的分析我们可以得到nnn必然只能拆分成1+1+11+1+11+1+1或者1+1+21+1+21+1+2的形式。因为题目要求乘积最大,当然是三个数越接近越好。如果nnn能被3整除,那么我们令x=y=z=商x=y=z=商x=y=z=商是最好的情况,如果nnn不能被3整除,那么也要尽量让这三个数接近。假设kkk是x,y,zx,y,zx,y,z的最大公因数,如果nnn可以拆分成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)的话nnn又是不能整除2k2k2k的。这样推过几轮以后我们可以发现只有上述的这两种情况.
代码
#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;
}
探讨了给定正整数n,寻找三个数x、y、z,使得它们能整除n且和为n,输出这些数的乘积最大化的问题。分析了数的拆分规律,给出了具体的代码实现。
180

被折叠的 条评论
为什么被折叠?



