「日常训练」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\)的情况,显然有\(a\ge 2\)
考虑\(a\ge 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}\)
假设\(b\ge 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\ne 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;
	}
}

posted @ 2018-09-24 19:30  ISoLT  阅读(143)  评论(0编辑  收藏  举报