题目链接:哆啦A梦传送门
题意:给一个数n,让你找出3的数 x,y,z,满足 x|n,y|n,z|n,切x*y*z要尽可能的大。
题解:我们一遇到这种多测试用例多,每个数字范围有大的纯数字题,首先要想的是快速打个表看看,因为这种题往往是用很精致的思路去做的。我们打完表后发现,只能能被3整除的数或者能被4整除的数才能有结果。
此时我们就可以这样想了,假设能被3整除,那么x=y=z=n/3。
假设能被4整除,那么我们可以分四分,其中两个各拿一份,另外一个人拿两份,那么x=y=n/4,z=*2*n/4=n/2。
这里我们简单做下解释:能被3整除,那么每份都是n/3,此时满足最大,为什么呢?我们可以这样思考,,当且仅当a==b是a*b最大。同理,能被4整除也是一样。
虽说打表能出结果,但有没有想过为什么只有被3整除和被4整除的情况才满足条件呢?
被3整除就不用过多解释了。
我们试着解释下被4整除,首先我们是不是每份都是n/4,那么即是 n/4|n,那么其中有一个人是拿两份的,也即(2*n/4=n/2)|n。
我们想下为什么被5整除就不行呢?我们还是按上面的套路,被5整除,我们就分5份,先每人一份,那么还剩两份,我们可以都分给同一个人,可是这样的话 (3*n/5就不一定被n整除了),同样,把这两份给两个人,这样也是一样(2*n/5就不一定被n整除了)。
故现在大概知道了。
拓展一下:
虽说现在这道题解决了,但现在我们换个问法,让你找4个数,跟上面同样的条件。
同样能被4整除或者能被6整除的数才满足条件。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
int main()
{
int ncase;
scanf("%d",&ncase);
while(ncase--)
{
LL n;
scanf("%lld",&n);
if(n%3==0){
n=n/3;
LL item=n*n*n;
printf("%lld\n",item);
}
else if(n%4==0){
n=n/4;
LL item=n*n*(2*n);
printf("%lld\n",item);
}
else puts("-1");
}
return 0;
}
我的标签:做个有情怀的程序员。