1419 最小公倍数挑战(素数性质之两两互质 与 取“3”个数的特殊性)

1419 最小公倍数挑战

 

几天以前,我学习了最小公倍数。玩得挺久了,想换换口味。

我不想用太多的数字,我想从1到n中选三个数字(可以相同)。使得他们的最小公倍数最大。

 收起

输入

单组测试数据。
第一行有一个整数n (1≤n≤1,000,000)。

输出

输出一个整数表示选三个数字的最大的最小公倍数。

输入样例

9
7

输出样例

504
210

思路:

       我们知道,相邻的两个自然数互质,相邻的两个奇数互质。

       因为题目取三个数的特殊性,所以当N为奇数时,N和(N-1)和(N-2)是两两互质的。N为偶数时,

首先想到的可行解必然是(N-1)*(N-2)*(N-3),即构造成奇数的形式。

       没想到的是,我们可以保留N和(N-1),用N-3替换掉N-2,得到另一个可行解,且该可行解一般大于

等于上述可行解,但偶数和奇数除非相邻否则是不一定互质的,但又因为本题仅取3个数的特殊性,且N和

N-3之间相差3,所以N和N-3之间唯一可能的公因子为3,且只要一方被3整除,另一方也一定是3的倍数。

       所以,对于N为偶数的情况,只需要判断N是否为3的倍数即可。是,ans=(N-1)*(N-2)*(N-3);

不是,ans=N*(N-1)*(N-3)。n小于等于2的情况特殊判断。

代码实现:

#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
const int N=2e5+100;

int main(){
	fun:
	LL n,ans=-1;
	cin>>n;
	if(n<=2)ans=n;
	else{
		if(n&1)ans=n*(n-1)*(n-2);
		else{
			if(n%3==0)ans=(n-3)*(n-1)*(n-2);
			else ans=n*(n-1)*(n-3);
		}
	}
	cout<<ans<<endl;
	return 0;
} 

THE END;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值