zoukankan      html  css  js  c++  java
  • 算法训练 最大最小公倍数

     算法训练 最大最小公倍数  
    时间限制:1.0s   内存限制:256.0MB

    问题描述

    已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。

    输入格式

    输入一个正整数N。

    输出格式
    输出一个整数,表示你找到的最小公倍数。
    样例输入
    9
    样例输出
    504
    数据规模与约定

    1 <= N <= 106。

    作为一个acmer,本以为蓝桥杯的题很水,我居然栽了好久。翻了别人的博客才知道,也不是很难,但思路要清晰。

    解题过程:

    显然需要这三个数尽量大,在n和n后面几个找。并且这三个数的gcd尽量小。本来把n当作其中一个,再找两个和n的gcd的数为1的,提交后是wa。

    当n是奇数,n,n-1,n-2分别是奇偶奇,三者gcd=1,此时lcm为三数之积,最大。

    当n是偶数,n,n-1,n-2分别是偶奇偶,n和(n-2)有2为公因子,lcm/2,这个损失就很大了。二者舍弃一个,显然优先考虑舍弃(n-2),那就找(n-3)。

    1.n和(n-3)没有公因子3,则gcd=1,lcm=n*(n-1)*(n-3)。

    2.n和(n-3)有3为公因子,lcm/3,损失更大了。再往后是(n-4),和n又有2为公因子,损失也很大。再往后可能有公因子5。损失越来越大,何时考虑到头都不一定,并且n比较小时第三个数可能还没有n的1/2。考虑舍弃n,则保留(n-1),(n-2),这两个数分别为奇数和偶数,则(n-3)为奇数。三者gcd=1,则lcm=(n-1)*(n-2)*(n-3)。

     1 #include <iostream>
     2 #include<stdio.h>
     3 #include <algorithm>
     4 #include<string.h>
     5 #include<cstring>
     6 #include<math.h>
     7 #include<map>
     8 #define inf 0x3f3f3f3f
     9 #define ll long long
    10 using namespace std;
    11 
    12 int main()
    13 {
    14     ll n;
    15     while(scanf("%lld",&n)!=EOF)
    16     {
    17         if(n&1)
    18             printf("%lld
    ",n*(n-1)*(n-2));
    19         else
    20         {
    21             if(n%3==0)
    22                 printf("%lld
    ",(n-1)*(n-2)*(n-3));
    23             else
    24                 printf("%lld
    ",n*(n-1)*(n-3));
    25         }
    26     }
    27     return 0;
    28 }
  • 相关阅读:
    实战weblogic集群之创建节点和集群
    实战weblogic集群之创建domain,AdminServer
    linux配置端口转发
    Linux系统下用户行为审计
    实战weblogic集群之安装weblogic
    MongoDB主从配置
    安装配置MongoDB
    PHPCMS v9 自定义表单添加验证码验证
    实战Nginx与PHP(FastCGI)的安装、配置与优化
    在线客服兼容谷歌Chrome、苹果Safari、Opera浏览器的修改
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/10385713.html
Copyright © 2011-2022 走看看