数论 + 贪心:最小公倍数:求最大最小公倍数
作者:互联网
总结1:
①求a,b,c三个数的最大公约数(a,b,c),也等于( (a,b) , c) ,也等于(a,(b,c)) .
②求a,b,c三个数的最小公倍数[a,b,c],也等于[[a,b],c] , 也等于[a,[b,c]].
③大于1的连续两个自然数一定互质(即最大公约数为1)
④两个奇数,差值为2,则这两个奇数也一定互质
总结2:
判断两个数是否互质的方法(几种常见的):
(一些数的规律和带特殊属性的数都是常考的内容)
1.1和任意大于1的自然数都互质
2.2和任意奇数都互质
3.相邻的两个自然数互质
4.相邻的两个奇数互质
5.不相同的两个质数互质
6.一个数是合数,另一个是质数,除合数是质数的倍数外,一般都是互质的,例:34和7
发现3(个人发现,个人证明):
x1,x2如果存在公约数,那么再 1 ~ max(x1,x2)的区间内,必定存在两个数x3,x4互质, x3 , x4都小于 max(x1,x2)
使得 x1 * x2 / gcd(x1,x2) == x3 * x4
x1 == k1 * t
x2 == k2 * t;
假设最大公约数为t
则 最小公倍数为 :
k1 * t * k2 * t / t;
①如果 k1 * t 与 k2 或者 k1 与 k2 * t无公约数, 则x3 == k1 * t , x4 == k2 或者 x3 == k1 , x4 == k2 * t。 则上面结论成立。
②如果 k1 * t 与 k2 有公约数 temp,则 x3 == k1 * t / temp , x4 == k2 * temp,
由于 t 为 x1,x2的最大公因数, 所以对应的temp 只能 <= t , 所以 x4一定小于等于 x2.
③如果 k1 与 k2 * t有公约数temp , 则 x3 == k1 * temp , x4 == k2;
同二,一定满足x3,x4都小于 max(x1,x2).
以上,证明任何x1,x2的值,都可以再1~max(x1,x2)的区间内找到最大公约数为1 的 x3,x4
使得 x1 * x2 / gcd(x1,x2) == x3 * x4
题目链接:http://lx.lanqiao.cn/problem.page?gpid=T12
题目:
问题描述
已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。
输入格式
输入一个正整数N。
输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入
9
样例输出
504
数据规模与约定
1 <= N <= 1e6。
思路:
由于我们要求的是三个数的最小公倍数的最大值。
而最小公倍数 实际上为a*b / gcd(a,b).
所以首先我们可以想到,所取的a,b越大越好,而gcd(a,b)越少越好,互质则最好不过。因为互质就成了a*b。
那么是否会存在a,b,c两两未必完全相互互质,而得到最大值呢?
实际上是可能的。如1,2,3,4的情况下 随机选择的3个数最小公倍数的最大值为 12。
可以是1,3,4。 但实际也可以是2,3,4。
但是:
由我们的结论1,3可以知道:
求[2,3,4]可以变为求【【2,4】,3】 .而[2,4]存在gcd() > 1。 实际上可以转为[1,4],gcd() == 1的情况。 然后变为求 【1,4,3】.
所以,不两两互质的情况,必存在一个 两两互质的情况可以代替它。
所以我们直接找两两互质下的最大值即可。因为两两互质下的值更为好算,直接就是
a * b * c.
而最小公倍数要最大,所以a,b,c从后往前找两两互质。
从而思路就是:
1.只找两两互质的情况。非两两互质跳过
2.a,b,c的值尽可能的大。
①当n为奇数的时候, 按照总结1之中可以知道,n 与 n - 1互质, n - 1与 n - 2互质, n 与 n - 2互质。 所以值就是最大值 n * (n - 1) * (n - 2)
②当n为偶数的时候,n与 n - 1互质, n - 1 与 n - 2互质,但是 n 与 n - 2都为偶数,所以一定不会互质, 最大公因数最小也会为2. 而由上面思路已经推出,找两两互质的情况必定满足最优解,只找两两互质即可。
所以根据贪心的想法,(n - 2)不行,那么先换一个小的值
n , n - 1 , n - 3 是否两两互质呢?
实际上这个也要分两种情况讨论:
(1)当n不为3的倍数的时候, n 与 n - 3是两两互质的。值为 n * (n -1) * (n - 3)必定就是最大值了。 因为3个数相乘, 比 n * (n - 1) * ( n - 3 ) 大的情况只有 n *( n - 1) * (n - 2)而它不满足我们的贪心策略
(2)当n 为3 的倍数的时候, n 与 n - 3就不是两两互质的了。 n为 3 * x , n - 3为 3 * (x - 1).所以n 与 n - 3至少会有一个公约数3.
那么n , n -1,n - 4呢?n为偶数, n - 4为偶数, 与 n - 2类似,不满足贪心两两互质策略。
那么 n , n - 1 , n - 5呢? 会不会存在n 与 n - 3不互质但是与 n - 5互质的情况呢?
实际上是会存在的。
但是这个时候需要考虑到的一个情况:
有可能 n - 1 , n - 2 , n - 3为最大嘛?
n - 1为奇数, 从而值为 ( n - 1 ) * (n - 2 ) * (n - 3)
所以就是比较
( n - 1 ) * (n - 2 ) * (n - 3) 与 n * (n - 1) * (n - 5)的值的大小了。
( n - 1 ) * (n - 2 ) * (n - 3) 的值为:n ^ 3 - 6 * n ^ 2 + 11 * n - 6
n * (n - 1) * (n - 5)的值为:n ^ 3 - 6 * n + 5 * n
只要n >= 1那么 11 * n - 6 >= 5 * n
以此类推n * (n - 1) * (n - 7)以及以后就更不用考虑了。
所以选择( n - 1 ) * (n - 2 ) * (n - 3)为最大的值
综上分析:
当n为奇数时,值就是 n * (n - 1) * (n - 2)
当n为偶数时,
①如果 n 与 n - 3互质, 则为 n * (n - 1) * (n - 3)
②如果n 与 n - 3不互质, 则为 (n - 1) * (n - 2) * (n - 3).
代码实现:
# include <iostream>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
if(n % 2 == 1) // 如果n为奇数
{
printf("%lld\n",(long long)n * (n - 1) * (n - 2));
}
else // 偶数
{
if(n % 3 == 0) // n能够被3整除
{
printf("%lld\n",(long long)(n - 1) * (n - 2) * (n - 3));
}
else
{
printf("%lld\n",(long long)n * (n - 1) * (n - 3));
}
}
return 0;
}
标签:公倍数,最小,x2,x3,x1,互质,x4,贪心 来源: https://blog.csdn.net/qq_49120553/article/details/119064143