基礎演算法題 素因子去重

2021-10-03 23:02:47 字數 1367 閱讀 8577

素因子去重題目

問題描述

給定乙個正整數n,求乙個正整數p,滿足p僅包含n的所有素因子,且每個素因子的次數不大於1

輸入格式

乙個整數,表示n

輸出格式

輸出一行,包含乙個整數p。

樣例輸入

1000

樣例輸出

10資料規模和約定

n<=10^12

樣例解釋:n=1000=23 * 53,p=2 * 5=10

思路一:通過篩選法將2~1012中的素數求出,再通過列舉素數的方式判斷素數是否為n的因數,將是n的素因數(不重複)累乘,即可得到答案。該思路的複雜度為o(n)。這個思路沒錯,但是資料規模和約定中寫明n<=1012,假設n==1012時,程式會出現執行時間過長的情況。

通過觀察題目,我們了解到p為n的素因數乘積,且每個素因子的次數不大於1。

考慮最糟糕的情況,假設1012>=n>=1011,同時n又恰好等於為106規模上的素數與105規模上的素數(不重複)的乘積,那麼我們只要判斷0~106內的素數的情況就能夠判斷出p,得出思路二。

思路二:篩選法將2~106中的素數求出,再通過列舉素數的方式判斷素數是否為n的因數,將是n的素因數累乘,即可得到答案。該思路的複雜度為o(n1/2)。滿足題目執行時間條件。

#include

#define ll long long

using namespace std;

ll n, p;

bool judge[

1000010];

ll sz[

100]

;voidss(

void

)//篩選法}}

intmain()

if(i==

1000000

)break;}

cout<

return0;

}

這**條件恰好卡在n<=1012這個條件。

如果我們輸入大於1012的數的話,由於p<=106,該**就可能判斷不出p的真實大小。

驗證一下我們的想法:

當n>1012

假設n=96714764456322(素數9834367*非素數9834366),很明顯此時n不是素數。

但是輸出程式後的結果如下:

p輸出n==96714764456322。

按照思路:在n為素數和非素數的乘積條件下,p一定滿足:p希望能夠將自己的一些學習經驗分享給有需要的人。

我是小鄭,乙個堅持不懈的小白。

素因子去重

演算法訓練 素因子去重 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給定乙個正整數n,求乙個正整數p,滿足p僅包含n的所有素因子,且每個素因子的次數不大於1 輸入格式 乙個整數,表示n 輸出格式 輸出一行,包含乙個整數p。樣例輸入 1000 樣例輸出 10資料規模和約定 n 10 12...

演算法訓練 素因子去重

題目鏈結 問題描述 給定乙個正整數n,求乙個正整數p,滿足p僅包含n的所有素因子,且每個素因子的次數不大於1 分析 之前寫了需要判斷是素數 雖然通過了 後面發現是不需要判斷的。因為當你每次去掉乙個素因子後,這個因子的倍數就會不存在了。這個和素數篩選差不多,只不過素數篩選是標記,這裡是刪除。因為i從最...

演算法訓練 素因子去重

傳送門 url 題目 問題描述 給定乙個正整數n,求乙個正整數p,滿足p僅包含n的所有素因子,且每個素因子的次數不大於1 輸入格式 乙個整數,表示n 輸出格式 輸出一行,包含乙個整數p。樣例輸入 樣例輸出 資料規模和約定 n 10 12 樣例解釋 n 1000 2 3 5 3,p 2 5 10 思路...