题意
1e6组询问,每次给你一个正整数n<=1e6
把n拆成三个能整除n的正整数x,y,z,且x+y+z=n,
输出最大的xyz三数乘积,若不存在则输出-1
思路来源
https://blog.csdn.net/xuanhuangwendao/article/details/81214066
题解
x,y,z只能表示为形如的形式,a为大于1的正整数,
不妨x<=y<=z,由z>=(x+y+z)/3则,即知a<=3,或
①,则,由y>=(x+y)/2则,由y<=z知,有
②,则,则y>=(x+y)/2则,
由y<=z且y+z<n知,a只能取4或3
(1),则
(2),则
即(x,y,z)解为或或
前提分别是n为3的倍数,4的倍数,6的倍数,
且有均值不等式,注意到三者越接近,乘积越大
则三者同时成立时,①>②(1)>②(2),
看一下乘起来的分母就能看出来
心得
暑假当时做的时候不会
现在当寒假作业被fls出出来了QAQ
觉得自己数论还是太菜了吖
就是一个分类讨论嘛emmm
代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int t;
ll n,ans;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%lld",&n);
ans=-1;
//if(n%6==0)ans=n/2*n/3*n/6; 注意到mod 6==0一定mod 3==0
if(n%4==0)ans=n/2*n/4*n/4;
if(n%3==0)ans=n/3*n/3*n/3;
printf("%lld\n",ans);
}
return 0;
}