您的位置:首页 > 其它

Codeforces 236C LCM Challenge 数论(基础题)

2017-01-16 15:23 253 查看
点击打开链接

题意:找到三个数<=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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: