235A - LCM Challenge lcm思维题

传送门:https://codeforces.ml/problemset/problem/235/A

题意:

  给你一个数字n,要求在n以内找到三个数,使它们的lcm最大,输出最大的lcm。

思路:

  lcm(n,m)=n*m/gcd(n,m),我们还能知道一个小定理那就是设lcm(n,m)=k则k一定是n-m的约数,为什么呢,因为n和m都可以用k的乘积来表示,那么他们的差也可以用k来表示所以结论成立。我们回到题目,要求找三个数,那么肯定要找三个尽可能大的数且互质,则答案就是他们的乘积了,我们猜想答案为n(n-1)(n-2),由之前的小定理得n和n-1互质,因为他们的gcd一定是1的约数也就是1了,同理可得n-1和n-2互质,我们再按小定理,可得n和n-2的gcd是2的约数,什么时候n和n-2互质呢,没错那就是n是奇数的时候,n是奇数n-2也就是奇数他们的gcd就不能是2,所以当n为奇数的时候ans=n(n-1)(n-2)。

  当n是偶数的时候,我们想用n是奇数的思路,猜想答案为(n-1)(n-2)(n-3),此时n-1是奇数符合上一段的结论,那么还有什么答案呢,当n和n-3互质的时候,还有答案为n(n-1) (n-3),这答案明显比(n-1)(n-2)(n-3)大,可n和n-3什么时候才互质呢?他们的gcd一定是3的约数,即要么1要么3,所以当n不是3的倍数时,它们的gcd只能是1,我们还可以很轻松地证明n(n-1) (n-3)>n(n-1)(n-2)/2,则再n不是3的倍数时n(n-1) (n-3)最大,是3的倍数时(n-1)(n-2)(n-3)最大。

ac代码:

 

#include<iostream>
#include<queue>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n;
int main()
{
    cin>>n;
    if(n<3) return cout<<n,0;
    if(n&1)  cout<<n*(n-1)*(n-2);
    else{
        if(n%3!=0) cout<<n*(n-1)*(n-3);
        else cout<<(n-1)*(n-2)*(n-3);
    } 
    return 0;
}

 

posted @ 2020-03-21 20:39  艾尔夏尔-Layton  阅读(149)  评论(0编辑  收藏  举报