最大最小公倍數

問題描述

已知一個正整數N,問從1~N中任選出三個數,他們的最小公倍數最大能夠爲多少。spa

輸入格式

輸入一個正整數N。code

輸出格式
輸出一個整數,表示你找到的最小公倍數。
樣例輸入
9
樣例輸出
504
數據規模與約定

1 <= N <= 106。 數學

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
long long n, l;
while(scanf("%d", &n)!=EOF){
if(n%2!=0)//n爲奇數 string


l = n*(n-1)*(n-2);
}
else if(n%3!=0)//n不能夠被3整除it


l = n*(n-1)*(n-3);
}
else{
l = (n-1)*(n-2)*(n-3);
}
printf("%lld\n", l);
}
return 0;
}io

思路

一看給的數據範圍那麼大,時間還1s,暴力是絕對超時的,這時候就要想,確定是有數學規律在的。要清楚下面兩個定理:class

定理1:大於1的兩個相鄰的天然數一定互質 
定理2:兩個數的最小公倍數在最大的狀況就是當兩個數互質的時候,他們的最小公倍數就是這兩個數的乘積數據

這時候就行了,咱們須要找三個互質的數,讓他們三個乘積最大就OK啦,確定是從n往下乘了,但這時候三個連續的數,有兩種狀況使其互質di

1. 偶 X 奇 X 偶 
2. 奇 X 偶 X 奇時間

這時候就考慮n的奇偶性了:

1. n爲奇數 
此時,n*(n-1)*(n-2)中,n,n-2爲奇數,n-1爲偶數,即確定不存在公因數2,由於這三個連續的數變化範圍不超過3,因此就算有一個數是3的倍數,也不會存在第二個數是3的倍數,即這三個數字都是互質的。

2. n爲偶數 
此時,n*(n-1)*(n-2)中,有兩個偶數,即存在公因數2,也就是說最小公倍數要除2了,就不是最大了的。因此不能存在 偶 X 奇 X 偶 這種狀況,就讓(n-2)變爲(n-3),大的數儘可能不變嘛,這時候呢,又恢復到了 奇 X 偶 X 奇 的狀況。

此時要考慮了,n和n-3之間,差了3,即若是n是3的倍數,n-3也必定是3的倍數,因此當n不是3的倍數的時候,n*(n-1)*(n-3)是ok的

當n是3的倍數的時候,(n-1)(n-2)(n-3),又恢復了 奇 X 偶 X 奇 的狀況了,OK!

相關文章
相關標籤/搜索