HDU 6298(找规律+思维)

题意

给一个数正整数 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
3111
4222
6222
8422
9333
12444
12633

  初步的分析我们可以得到 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) 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的话 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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值