1. 题目要求
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。输入格式
输入一个正整数N。
输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入
9
样例输出
504
数据规模与约定
1 <= N <= 10^6。
2. 基本概念
首先要知道什么是最小公倍数,以及怎么去求最小公倍数。
2.1 最小公倍数的概念
公倍数(common multiple)指在两个或两个以上的自然数中,如果它们有相同的倍数,这些倍数就是它们的公倍数,其中除0以外最小的一个公倍数,叫做这几个数的最小公倍数
2.2 最小公倍数计算方法
2.2.1 分解质因数法
先把这几个数的质因数写出来,最小公倍数等于它们所有的质因数的乘积(如果有几个质因数相同,则比较两数中哪个数有该质因数的个数较多,乘较多的次数)。
看看下面例子就知道如何去做了。求45和30的最小公倍数。
45=3*3*5
30=2*3*5
45和30的不同质因数有一个2;共同的质因数有两个,分别是3、5。
接下来共同的质因数,45中出现了两个3,所以计算最小公倍数的时候乘两个3。共同质因数5在45和30都只出现了一次,计算最小公倍数的时候乘一个5就行了。
因此,45和30的最小公倍数为:2*3*3*5=90
2.2.2 公式法
由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积。即(a,b)×[a,b]=a×b。所以,求两个数的最小公倍数,就可以先求出它们的最大公约数,然后用上述公式求出它们的最小公倍数。
例如,求45和30的最小公倍数。
45和30的最大公约数为15,两者之积为45*30=1350
然后用1350除以15,即1350÷15=90
3. 解题思路
通过分解质因数法可以知道,最小公倍数的计算过程中,会因为有一些共同质因数,而导致最小公倍数小于两者的乘积,对于三个数的最小公倍数也是如此,因此我们要尽量避免这种因为共同质因数而带来的损失,就会使得我们得到的最小公倍数是局部最大的。因此只要我们找出三个最大的互质数之积,这题就解决了。
- 由于连续的3个数中,如果是奇数 偶数 奇数 ,那这三个数一定互质,证明方法也很简单。我们用反证法:
大前提是 n 为奇数,则 n-2、n-1、n这三个数满足奇数 偶数 奇数
我们先证明 n 和 n-2 这两个奇数互质。
假设 n 和 n-2 不互质,那么就存在一个公约数 p(p>1,且为整数),使得 n = p * q ( q 为整数),n-2 = p * r( r 为整数),
上两式相减,得到 2 = p * ( q - r ),由于 p 和 ( q - r )都是整数,故只能是 p = 2 (因为p>1)、q-r = 1,
这样就与 n 和 n-2 为奇数矛盾了,因为是2的倍数,
因此, n 和 n-2 互质。
再证明相邻两个数 n 和 n-1 互质。
假设 n 和 n-1 不互质,那么那么就存在一个公约数 p(p>1,且为整数),使得 n = p * q ( q 为整数),n-1 = p * r( r 为整数),
上两式相减,得到 1 = p * ( q - r ),由于 p 和 ( q - r )都是整数,所以 p 和( q- r )都只能为1,
这与p > 1矛盾,
因此, n 和 n-1 互质。
至此,三个连续的 奇数 偶数 奇数,n-2、n-1、n 一定两两互质。
- 连续的3个数中,还有可能是 偶数 奇数 偶数 这种情况,但是这种情况会导致两个偶数都是2的倍数,最小公倍数损失一半,因此我们考虑将较小的偶数减1变成奇数,这样就相当于是 n-3 、n-1、n 这三个数了。由上面知道 n-3 和 n-1 是连续的两个奇数,肯定互质,n-1和n是连续的两个数,也肯定互质,那么n和n-3是否一定互质呢?下面我们来探索一下。证明的思路和上面都是一样的。
大前提是n为偶数,,则 n-3、n-1、n这三个数满足奇数 奇数 偶数
我们下面要证明n和n-3是否互质,如果不互质,那要满足什么条件才能使得这两个数互质。
假设 n 和 n-3 不互质,那么就存在一个公约数 p(p>1,且为整数),使得 n = p * q ( q 为整数),n-3 = p * r( r 为整数),
上两式相减,得到 3 = p * ( q - r ),由于 p 和 ( q - r )都是整数,因此 p = 3 、q - r =1 或者 p = 1 ,q - r = 3,
到这里并不能找出矛盾,
因此我们添加一个条件,使之矛盾(楼下保安:去去去,你又来找茬。我:emmm…)
由于 p 是大于1的,观察两个结论中,有一个 p = 1的,所以我们就从这入手,添加一个条件使得能够得出该结论。所以,我们添加一个条件,排除掉p = 3 、q - r =1这种情况。很明显 p = 3 的时候,n 和 n - 3都是3的倍数。
因此我们添加的条件是: n 不为3的倍数( n - 3 肯定也不为3的倍数了)
按照这个条件再严格证明一下。
假设 n 和 n-3 不互质,那么就存在一个公约数 p(p>1,且为整数),使得 n = p * q ( q 为整数),n-3 = p * r( r 为整数),
上两式相减,得到 3 = p * ( q - r ),由于 n 不为3的倍数,所以 p 一定不为3,因此只能是 p = 1,q - r = 3,
这与 p > 1矛盾,
因此当 n 不为3的倍数,且 n 为奇数时,n 与 n-3 一定互质。
至此,矛盾大王实至名归。
有了这两个最优解的可能性,这样的话本题目就很简单了。
伪代码如下:
输入N
result = 1
for n form N to 3 //逆序遍历
if n为奇数 且 result < n * (n - 1) * (n - 2) //情况一,奇数、偶数、奇数
result = n * (n - 1) * (n - 2)
if n为偶数 且 不能整除3 且 result < n * (n - 1) * (n - 3) //情况一,奇数、偶数、奇数
result = n * (n - 1) * (n - 3)
输出result
python代码如下:
N = int(input())
result = 1
for n in range(N, 2, -1):
if n % 2 == 1 and result < n * (n - 1) * (n - 2):
result = n * (n - 1) * (n - 2)
if n % 2 == 0 and n % 3 != 0 and result < n * (n - 1) * (n - 3):
result = n * (n - 1) * (n - 3)
print(result)
如果有帮助,还望少侠留下你的赞!感谢支持。