算法训练最大最小公倍数
来源:互联网 发布:3dmax材质数据 编辑:程序博客网 时间:2024/06/05 22:48
已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。
输入一个正整数N。
1 <= N <= 106。
开始无脑枚举,发现全部超时 哈哈哈哈哈哈哈
然后提示是贪心,但是没想到怎么贪
然后上网搜了下,看到一个小哥哥写的很好
于是学习了一下
在一组数中找三个数,使他们的最小公倍数最大,我们知道,两个数的最小公倍数在最大的情况就是当两个数互质的时候,他们的最小公倍数就是这两个数的乘积,而且还有那么一个定理,即两个相邻的自然数互质,即使我们不知道定理怎么证明,但大体能想出来,但这是三个数,也就是说存在 奇-偶-奇 和 偶-奇-偶 两种情况。
一:奇-偶-奇 这种情况用于n是奇数的情况,即 最大的三个数就是 n,n-1,n-2,那么可以看到,因为n和n-2都是奇数,所以肯定不存在公因数2,假设三个数中有一个存在因数3,那么另外两个肯定不存在因数3,因为他们的变化范围都小于3,也就是说,这三个数不仅是最大的,还是互质的,也就是说最大的最小公倍数就是这三个数的乘积,即n*(n-1)*(n-2)相信大部分人都可以想到这一步
二:偶-奇-偶 对于这种情况两个偶数肯定是存在公因数2,也就是意味着最小公倍数要除以2,这是绝对不能容忍的,所以我们稍微缩小一下数,即n,n-1,n-3,这样就又变成奇-偶-奇的结构了,但还有一个问题,就是假如偶数n存在因数3,那么n-3也必定有因数3,这直接导致最小公倍数除以3,更加不能容忍,为了保持奇-偶-奇的结构不变,只能变那个偶数,而离他最近的偶数就是n-2了,这下就完美了,3个数依然是互质的,最小公倍数就是(n-1)*(n-2)*(n-3)
贴代码:
#include<bits/stdc++.h>using namespace std;typedef long long ll; int main(){ll n;cin>>n;if(n<=2)cout<<2;else if(n%2 == 1)cout<<n*(n-1)*(n-2);else if(n % 3 == 0)cout<<(n-1)*(n-2)*(n-3);elsecout<<n*(n-1)*(n-3);return 0;}
- 最大最小公倍数 ( 算法训练 )
- 算法训练 最大最小公倍数
- 算法训练 最大最小公倍数
- 算法训练 最大最小公倍数
- 算法训练 最大最小公倍数
- 算法训练 最大最小公倍数
- 算法训练 最大最小公倍数
- 算法训练 最大最小公倍数
- 算法训练 最大最小公倍数
- 算法训练 最大最小公倍数
- 算法训练 最大最小公倍数
- 算法训练 最大最小公倍数
- 算法训练 最大最小公倍数
- 算法训练 最大最小公倍数
- 算法训练 最大最小公倍数
- 算法训练 最大最小公倍数
- 算法训练 最大最小公倍数
- 算法训练 最大最小公倍数
- 持续集成环境的搭建(二)——Docker的安装
- vuejs 详解
- 如何使用TensorFlow和VAE模型生成手写数字
- node+express+mysql 实现基本CRUD
- 20170622
- 算法训练最大最小公倍数
- 栈桢
- kuangbin专题五 并查集 POJ 1456 Supermarket
- ifconfig命令学习
- Linux 管理本地用户账户
- 状压DP
- 《什么是流式思维?》读后自认为的精华内容
- 欢迎使用CSDN-markdown编辑器
- MyBatis 动态SQL