HDU 6298(找规律+思维)

探讨了给定正整数n,寻找三个数x、y、z,使得它们能整除n且和为n,输出这些数的乘积最大化的问题。分析了数的拆分规律,给出了具体的代码实现。

题意

给一个数正整数 nnn,问是否存在三个数x,y,z,x,y,z,x,y,z, 他们能整除nnnx+y+z=nx+y+z=nx+y+z=n。如果不存在输出−1-11,否则输出x×y×zx\times y \times zx×y×z,如果有多个值,输出最大的那个。

分析

这个我们可以枚举几个例子,首先nnn最小从3开始

nnnxxxyyyzzz
3111
4222
6222
8422
9333
12444
12633

  初步的分析我们可以得到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整除,那么也要尽量让这三个数接近。假设kkkx,y,zx,y,zx,y,z的最大公因数,如果nnn可以拆分成k(1+2+3)k(1+2+3)k1+2+3的形式,我们自然可以变成k(2+2+2)k(2+2+2)k2+2+2这样又回到了原来的1+1+1;如果是k(1+2+2)k(1+2+2)k1+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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值