-
蓝桥杯
-
ALGO-2最大最小公倍数
-
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。
输入格式
输入一个正整数N。
输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入
9
样例输出
504
数据规模与约定
1 <= N <= 106。
-
前提知识:
-
1. 最小公倍数
- k个数字的最小公倍数不会超过k个数字相乘
-
2. 互质
-
什么是互质?
- 两个数的公约数只有一,这样的数叫互质数。两两互质,就是几个数的公约数只有一
- 互质的性质
- 如果几个数两两互质,那么他们的最小公倍数是他们的乘积。
- 互质的判别
- ① 相邻的两个自然数是互质数。如 15与 16
- ② 相邻的两个奇数是互质数。如 49与 51
-
-
3. 整除
- a 整除 b,是指 b÷a 的商没有余
-
-
逻辑:
-
找到1~N内三数相乘的最大最小公倍数,首先要知道任意 k 个数的最小公倍数不会超过这 k 个数相乘。如果我们想要找到最大的最小公倍数,这三个数应该满足
-
①1~N内尽可能靠近N
-
②它们的最小公倍数是它们相乘(即互质)
-
- 问题转为:如何找到在 1~N 内最大的互质的三个数?
- 我们由数学知识可知:
- Ⅰ)相邻的自然数互质
- Ⅱ)相邻的奇数互质
- 既然要靠近N,那么我们直接先假设 N 为其中的一个数,然后接着判断 N-1、N-2 ... :
-
当 N 是奇数时:
- N、N-1、N-2为 奇-偶-奇 的组合,由之前的数学知识 Ⅰ、Ⅱ 很容易知道这样的组合一定是互质的,所以最大最小公倍数就是 N*(N-1)*(N-2)
-
当 N 是偶数时:
- 1. N、N-1、N-2中,N和N-2一定有公约数2,不互质,不行。我们考虑用 N-3 去替代其中的一个数字,为了使这三个数相乘最大,我们先尝试用 N-3 代替最小的 N-2(贪心)
- 现在考虑的数字变为 N、N-1、N-3。
- 如果 3 不整除 N 的话,N、N-1、N-3 是 偶-奇-奇组合,这里只要 偶和奇 互质,它们就全部互质了。故答案为 N*(N-1)*(N-3)
- 但如果 3 能整除 N 的话,那么 3 同样能整除 N,这样 N 和 N-3 一定有公约数 3 就不互质了,不行。
- 同理,如果我们尝试用 N-4、N-5 .... 去代替 N-1 ,你会发现它们又可能有公约数 4、5...,比之前用 N-3 去替代的结果还差(数字更小,公约数还更大,公倍数当然越小啦)。
- 2. 所以这时候我们要考虑用 N-3 去替代之前 N、N-1、N-2 中的别的数字。现考虑用 N-3 代替 N-1(贪心)
- 现在我们考虑的数字变为 N、N-2、N-3,此时 3 是能整除 N 的, 3也是能整除 N-3 的 ,所以肯定是不行滴。
- 3. 最终我们考虑用 N-3 去替代 N
- 现在我们考虑的数字变为 N-1、N-2、N-3,为 奇-偶-奇 的组合,是互质的,所以我们最终的答案为 (N-1)*(N-2)*(N-3)
- 现在考虑的数字变为 N、N-1、N-3。
- 1. N、N-1、N-2中,N和N-2一定有公约数2,不互质,不行。我们考虑用 N-3 去替代其中的一个数字,为了使这三个数相乘最大,我们先尝试用 N-3 代替最小的 N-2(贪心)
-
-
Python代码如下
N = int(input())
if(N%2==0): #是偶数
if(N%3==0): #能被3整除
print((N-1)*(N-2)*(N-3))
else: #不能被3整除,贪心
print(N*(N-1)*(N-3))
else:
print(N*(N-1)*(N-2))