(基本结论:相邻的两数互质)
若n为奇数易知n*(n-1)*(n-2)为最大
奇 | 偶 | 奇 | 偶 | 奇 | 偶 |
N-5 | N-4 | N-3 | N-2 | N-1 | N |
若n为偶数,n与(n-2)有公约数2,不可以
①n不为3的倍数时,n,(n-1),(n-3)三个数互质,n*(n-1)*(n-3)为最大
②n为3的倍数时,明显有n和n-3有公约数3
于是考虑n*(n-1)*(n-4),明显有n和(n-4)都是偶数,有公约数2
于是考虑n*(n-1)*(n-5),与(n-1)*(n-2)*(n-3)进行比较
n*(n-1)*(n-5) - (n-1)*(n-2)*(n-3) = 6(1-n),当n大于1时,恒小于
说明(n-1)*(n-2)*(n-3)较大,为最大公约数
ps. 吐槽一下题目的条件真的莫名其妙,1 <= N <= 106
N=1是什么意思?可以重复选?
代码:
#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <stack>
#include <list>
#include <algorithm>
using namespace std;
unsigned long long maxGY(unsigned long long a , unsigned long long b) {
if(a>b) swap(a,b);
int rest = b % a;
while(rest) {
b = a;
a = rest;
rest = b%a;
}
return a;
}
unsigned long long maxGY(unsigned long long a , unsigned long long b,unsigned long long c) {
return maxGY(maxGY(a,b),c);
}
int main() {
unsigned long long n = 0;
cin>>n;
if(n%2) {
cout<<n*(n-1)*(n-2);
} else {
if(n%3) {
cout<<n*(n-1)*(n-3);
} else {
cout<<(n-1)*(n-2)*(n-3);
}
}
return 0;
}
原题:
问题描述
已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。
输入格式
输入一个正整数N。
输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入
9
样例输出
504
数据规模与约定
1 <= N <= 106。