算法训练 最大最小公倍数
算法训练 最大最小公倍数
时间限制: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 }