zoukankan      html  css  js  c++  java
  • 「日常训练」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发布。
  • 相关阅读:
    新闻项目——项目准备——代码抽取
    新闻项目——立项准备——框架搭建
    测试总结
    OSI——网络层
    软件测试的方法
    flask中cookie和session介绍
    flask数据库基本操作
    csrf原理和flask的处理流程
    xadmin快速搭建后台管理系统
    orm的聚合索引
  • 原文地址:https://www.cnblogs.com/samhx/p/HDU-6298.html
Copyright © 2011-2022 走看看