「日常训练」Maximum Multiple(HDU-6298)

题意与分析

一开始以为是一条高深的数学题,跳过去了,后来查其他题目的代码的时候无意看到,一看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;
	}
}

如非注明,原创内容遵循GFDLv1.3发布;其中的代码遵循GPLv3发布。
原文地址:https://www.cnblogs.com/samhx/p/HDU-6298.html