算法训练 最大最小公倍数

 算法训练 最大最小公倍数  
时间限制: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*(n-1)*(n-2));
19         else
20         {
21             if(n%3==0)
22                 printf("%lld\n",(n-1)*(n-2)*(n-3));
23             else
24                 printf("%lld\n",n*(n-1)*(n-3));
25         }
26     }
27     return 0;
28 }

 

posted @ 2019-02-15 20:19  守林鸟  阅读(611)  评论(0编辑  收藏  举报