题意:找到三个数<=n (n<=1e6)&&使LCM(a,b,c)尽量大
LCM=(a*b*c)/(d1*d2) d1为gcd(a,b) d2为gcd(ab/d1,c)
n<3特判
n>3:分以下两种情况
若n为奇数: n-1为偶数与n,n-1都互质&&gcd(n,n-2)=1(n为奇数) 设d|n&&d|n-2 则d|2 d<=2 由n为奇数得 d=1
所以三个数两两互质 直接相乘就能得到最大的LCM
若n为偶数 可得一个LCM k1=(n-1)(n-2)(n-3) 可能比k1大的只有当n%3!=0 -> gcd(n,n-3)=1 LCM(n,n-1,n-3)=n*(n-1)*(n-3)>k1
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+20;
ll n,ans;
ll gcd(ll a,ll b)
{
return a%b==0? b:gcd(b,a%b);
}
int main()
{
while(cin>>n)
{
if(n>=3)
{
if(n%2)
cout<<n*(n-1)*(n-2)<<endl;//奇数开头三个数互质
else
{
ll k1=(n-1)*(n-2)*(n-3);
//显然n%2==0&&n>3,LCM(n,n-1,n-2)<k1
//当n%2==0&&n%3!=0 -> gcd(n,n-3)=1 LCM(n,n-1,n-3)=n*(n-1)*(n-3)>k1
ll k2=0;
if(n%3)
{
k2=n*(n-1)*(n-3);
}
cout<<max(k1,k2)<<endl;
}
}
else
{
if(n==1)
cout<<1<<endl;
else if(n==2)
cout<<2<<endl;
}
}
return 0;
}

本文探讨了在给定整数n的情况下,如何选择三个不超过n的整数a、b、c,使得这三个数的最小公倍数(LCM)最大化。文章通过分析不同情况下数的性质,提出了一种高效的解决方案,并提供了完整的C++代码实现。

926

被折叠的 条评论
为什么被折叠?



