link:http://lx.lanqiao.cn/problem.page?gpid=T12
问题描述
已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。
输入格式
输入一个正整数N。
输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入
9
样例输出
504
数据规模与约定
1 <= N <= 106
求1到n的三个数的最大的最小公倍数,那么就是找出三个最大两两互质的数,然后输出它们的乘积。
首先,任意两个相邻的数两两互质。
如果n为奇数,那么n和n-1互质,n-1和n-2互质,因为n为奇数,所以任意大于2的数都不会是他们的最大公约数。
如果n为偶数,分两种情况,n是否为3的倍数,如果不是,那么由上一条可知最大的三个互质数是n、n-1、n-3(因为n-2也是偶数,和n不互质)。如果是,那么n和n-3肯定有一个公约数3,那么它们的乘积就不是最大,把n的值往下取为n-2;
具体看代码
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int a,int b)
{
int r=a%b;
while(r)
{
a=b;
b=r;
r=a%b;
}
return b;
}
int lcm(int a,int b)
{
return a*b/gcd(a,b);
}
int main()
{
long long ans,n;
while(cin>>n)
{
if(n<=2)
ans=n;
else if(n%2)
ans=n*(n-1)*(n-2);
else
{
if(n%3)
ans=n*(n-1)*(n-3);
else
ans=(n-1)*(n-2)*(n-3);
}
cout<<ans<<endl;
}
return 0;
}