题意与分析
一开始以为是一条高深的数学题,跳过去了,后来查其他题目的代码的时候无意看到,一看emmmmmm
稍微思考一下就有了。(1=frac{1}{3}+frac{1}{3}+frac{1}{3}=frac{1}{2}+frac{1}{3}+frac{1}{6}=frac{1}{2}+frac{1}{4}+frac{1}{4})。那么是不是只有这三种?这个问题就要靠整数数论来解答了。
以下是证明过程:
先考察(a<b<c)的情况,显然有(age 2)。
考虑(age 3),从而有(frac{1}{a}+frac{1}{b}+frac{1}{c} le frac{1}{3}+frac{1}{4}+frac{1}{5} = frac{47}{60} < 1),不合题意,舍去。
故(a=2)。
接下来考虑b。显然有(frac{1}{b}+frac{1}{c}=frac{1}{2})。
假设(bge 4),有(frac{1}{b}+frac{1}{c} ge frac{1}{4}+frac{1}{5} = frac{9}{20} < frac{1}{2}),故(b=3)。
在这种情况下,(a,b,c)仅有一组解。
考察(a=b=c)的情况,有一组解。
考察(a=b
e c)的情况,通过类似的证明,可以得到另一组解(简要证明:分为两种情况,(a<c)和(a>c)来讨论)。
当然了,这些对数论大手子都是在脑子里过一遍就有了简单的一腿,也就我们这种弟弟会写个半天。
注意到(T le 10^6),注意关掉流同步/C-style io。
代码
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T; cin>>T;
while(T--)
{
int n;
cin>>n;
ll a,b,c;
ll ans=0;
if(n%3==0)
{
a=b=c=n/3;
ans=max(ans,a*b*c);
}
if(n%2==0 && n%3==0)
{
a=n/2;b=n/3;c=n/6;
ans=max(ans,a*b*c);
}
if(n%4==0)
{
a=b=n/4;c=n/2;
ans=max(ans,a*b*c);
}
if(ans==0) cout<<-1<<endl;
else cout<<ans<<endl;
}
}