1419 最小公倍数挑战
几天以前,我学习了最小公倍数。玩得挺久了,想换换口味。
我不想用太多的数字,我想从1到n中选三个数字(可以相同)。使得他们的最小公倍数最大。
收起
输入
单组测试数据。 第一行有一个整数n (1≤n≤1,000,000)。输出
输出一个整数表示选三个数字的最大的最小公倍数。输入样例
9 7输出样例
504 210
思路:
我们知道,相邻的两个自然数互质,相邻的两个奇数互质。
因为题目取三个数的特殊性,所以当N为奇数时,N和(N-1)和(N-2)是两两互质的。N为偶数时,
首先想到的可行解必然是(N-1)*(N-2)*(N-3),即构造成奇数的形式。
没想到的是,我们可以保留N和(N-1),用N-3替换掉N-2,得到另一个可行解,且该可行解一般大于
等于上述可行解,但偶数和奇数除非相邻否则是不一定互质的,但又因为本题仅取3个数的特殊性,且N和
N-3之间相差3,所以N和N-3之间唯一可能的公因子为3,且只要一方被3整除,另一方也一定是3的倍数。
所以,对于N为偶数的情况,只需要判断N是否为3的倍数即可。是,ans=(N-1)*(N-2)*(N-3);
不是,ans=N*(N-1)*(N-3)。n小于等于2的情况特殊判断。
代码实现:
#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
const int N=2e5+100;
int main(){
fun:
LL n,ans=-1;
cin>>n;
if(n<=2)ans=n;
else{
if(n&1)ans=n*(n-1)*(n-2);
else{
if(n%3==0)ans=(n-3)*(n-1)*(n-2);
else ans=n*(n-1)*(n-3);
}
}
cout<<ans<<endl;
return 0;
}
THE END;