数论 + 贪心:最小公倍数:求最大最小公倍数

 总结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;
}
上一篇:连接文件


下一篇:linux文件系统与日志文件