多校1 hdu 6298 Maximum Multiple (打表找规律以及做这类方法的套路)

题目链接:哆啦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,此时满足最大,为什么呢?我们可以这样思考,{\color{Red} a+b\geq 2*\sqrt{a*b}},当且仅当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;
}

 

我的标签:做个有情怀的程序员。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值