nyoj 977 最大的最小公倍數

2021-06-28 19:21:02 字數 1220 閱讀 8194

最大的最小公倍數

描述:對於乙個整數n(1<=n<=10^6),取三個不小於n的正整數,使其最小公倍數最大。

先介紹三條數論的基本知識:

1.任意大於1的兩個相鄰的正整數是互質的。

2.兩個數的公約數只有1和-1,稱為互質整數。

3.兩個數的公約數只有1,稱為互質自然數。

分析:最先想到的答案是n*(n-1)*(n-2),(注:n>2),但是我們得考慮是的,n和(n-2)差2,是否也互質?

情況一:當n為奇數時,我們考慮它二者是否有公約數2,顯然沒有,即結果為n*(n-1)*(n-2).

情況二:當n為偶數時,我們可以知道,它兩者有公約數2,此時,我們在考慮n*(n-1)*(n-3),

現在,(n-1)和(n-3)都是奇數,是互質,那我們就只要考慮n和(n-3)是否存在公約數                                       了,即n是否能被3整除;若n不能被3整除,則就是結果了,否則,我們考慮n*(n-1)*(n-4),可以看到,n和(n-4)又都是偶數了...那我們再考慮n*(n-1)*(n-5),我們一直都在看n*(..)*(...),忘記了(n-1)*(n-2)*(n-3)了沒,我們來計算一下:

n*(n-1)*(n-5)=n^3-6*n^2+5*n (1)

(n-1)*(n-2)*(n-3)=n^3-6*n^2+11*n-6 (2)

(2)-(1):6*n-6>=0

即,如果(1)式可以的話,那(2)肯定要大於等於(1),所以,在這種情況下,(2)式是答案。

這裡需要注意用cin cout  如果用pringf和scanf會出現各種或者編譯器或者測評系統不認識的錯誤。

#include #include using namespace std;

int main()

{ long long n, ans;

while(cin>>n)

{if(n <= 2)

ans = n;

else if(n & 1 == 1)

ans = n*(n-1)*(n-2);

else if(n % 3 == 0)

ans = (n-1)*(n-2)*(n-3);

//一三都是偶數,如果移第三個,那麼會移到被3整除的數,又和第乙個數有了公約數3;如果移第二個,又會移到偶數;只能移第乙個,這樣就轉化成了上一種情況。

else

ans = n*(n-1)*(n-3);

cout<

最大最小公倍數

時間限制 1 sec 記憶體限制 128 mb 提交 125 解決 4 提交 狀態 討論版 題目描述 已知乙個正整數n,問從1 n中任選出三個數,他們的最小公倍數最大可以為多少。輸入 每個測試點 輸入檔案 存在多組測試資料。每個測試點的第一行為乙個整數task,表示測試資料的組數。在一組測試資料中 ...

最大最小公倍數

問題描述 已知乙個正整數n,問從1 n中任選出三個數,他們的最小公倍數最大可以為多少。輸入格式 輸入乙個正整數n。輸出格式 輸出乙個整數,表示你找到的最小公倍數。樣例輸入 9樣例輸出 504資料規模與約定 1 n 106。include include include using namespace...

最大最小公倍數

題目 已知乙個正整數n,問從1 n中任選出三個數,他們的最小公倍數最大可以為多少。輸入格式 輸入乙個正整數n 輸出格式 輸出乙個整數,表示你求得的最小公倍數 樣例輸入 樣例輸出 504注釋 504 9 8 7 資料規模與約定 1 n 106 分析 題目要求涉及貪心演算法,對於個人而言,更像是乙個純數...