問題描述
已知一個正整數N,問從1~N中任選出三個數,他們的最小公倍數最大可以為多少。
輸入格式
輸入一個正整數N。
輸出格式
輸出一個整數,表示你找到的最小公倍數。
樣例輸入
9
樣例輸出
504
數據規模與約定
1 <= N <= 106。
解題報告:
這個題的意思就是要我們在1~N的范圍內找三個數,使他們的最小公倍數在這個范圍內的組合是最大的。那么你的第一印象是什么的?我的第一印象是找三個兩兩互質的數,這樣只需要相乘即可,就沒有需要約分的地方。
接下來先說一個結論:大於1的兩個相鄰的自然數必定互質。
而對於1~N的范圍,肯定是 n*(n-1)*(n-2)的乘積最大、如果這三個數還兩兩互質的話那就最棒了。
如果n是奇數,那么 n、n-1、n-2必定兩兩互質,要是有些糾結的話,那么我們就分析在什么情況下可能會存在公因子。n是奇數,那么n,n-1,n-2一定是兩奇加一偶的情況。公因子2直接pass,因為只有一個偶數。假設剩下的n,n-2中有一個數能被3整除,那么有公因子的數一定是n或n-2加減3才能得到的情況。為此,n,n-1,n-2的乘積不僅是最大的,而且一定兩兩互質。
如果n是偶數,繼續分析n*(n-1)*(n-2),這樣的話n和n-2必定有公因子2,那么就換成式子n*(n-1)*(n-3)。然后仔細思考一下,不行啊,若偶數本身就能被3整除的話,那么式子n*(n-1)*(n-3)也不成立了,n和n-3就有公因子3,再仔細思考一下,式子就變成了(n-1)*(n-2)*(n-3),兩奇夾一偶的情況。
1 #include<iostream> 2 using namespace std; 3 4 int main() { 5 long long n, ans; 6 while(cin >> n) { 7 if(n <= 2) { 8 ans = n; 9 } 10 else if(n % 2) { 11 ans = n * (n - 1) * (n - 2); 12 } 13 else { 14 if(n%3) ans = n * (n-1) * (n-3); 15 else ans=(n-1) * (n-2) * (n-3); 16 } 17 cout << ans << endl; 18 } 19 retur