传送门: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; }