zoukankan      html  css  js  c++  java
  • 235A

    传送门: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;
    }
  • 相关阅读:
    Python测试框架:pytest
    用Python unittest搭建自动化测试框架
    unittest单元测试框架
    golang获取本地dns服务器
    Go语言HTTP请求头小写问题
    MAC上使用nginx搭建直播服务器
    go packages 学习
    Cloud Native Computing Foundation
    普通文件I/O需要两次复制,内存映射文件mmap一次复制
    page cache & buffer cache
  • 原文地址:https://www.cnblogs.com/qq2210446939/p/12541840.html
Copyright © 2011-2022 走看看