NYOJ 520 解題報告

2021-07-03 22:17:25 字數 1398 閱讀 7641

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度: 2 描述

greyants最近正在學習數論中的素數,但是現在他遇到了乙個難題:給定乙個整數n,要求我們求出n的最大素因子的序數,例如:2的序數是1,3的序數是2,5的序數是3,以此類推. 研究數論是需要很大的耐心的,為了懲罰那些沒有耐心讀完題目的童鞋,我們規定:1的最大素因子序數是0.

輸入有多組測試資料,每一行輸入乙個數字n.(0輸出

在接下來的一行,輸出結果.

樣例輸入

234

5

樣例輸出

121

3

這道題可把我坑慘了,看著感覺很簡單,但是一寫就容易tle~~~還是來說說比較快捷的思路吧。這個思路是根據篩法改造而來。先從2開始,然後將2標記為第乙個素數(即將最大素因子序數標為1),接著將2的倍數的最大素因子序數都標為1。然後再到3,將其最大素因子序數標為2,接著將3的倍數的最大素因子序數都標為2(注意,比如6,先前我們已經將其的最大素因子序數標為1,這時又發現6的乙個因子3序數比2的大,所以直接將前面的序數覆蓋掉)。再到4,由於4已經有了序數了(即被篩選過了),跳過。再到5,……一直到1000000。有了這張表,不管來什麼資料我都能一口報出答案(當然不能超過1000000)。

下面是我的**(說多了都是淚,來之不易!)

#include #define max_size 1000000

void init(int prime)

k++;}}

}int main()

; init(prime);

while((scanf("%d",&n))!=eof)

return 0;

}

回頭再來看標程,發現標程的**有些複雜了。

#include#include#include#includeusing namespace std;

#define max 1000005

bool flag[max];

int res[max],prime[1005],cnt[max];

void init()

} for(int i = 2;i < 1000003;++i)

if(!flag[i]) res[i] = cnt[i] = cnt[i-1] + 1;

else cnt[i] = cnt[i-1];

}int judge(int i)

res[i] = res[x];

} return res[i];

}int ssca(int n)

}int main()

return 0;

}

乍一看,就感覺十分複雜,算了,還是不仔細琢磨了。



NYOJ 520 最大素因子

時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 greyants最近正在學習數論中的素數,但是現在他遇到了乙個難題 給定乙個整數n,要求我們求出n的最大素因子的序數,例如 2的序數是1,3的序數是2,5的序數是3,以此類推.研究數論是需要很大的耐心的,為了懲罰那些沒有耐心讀完...

NYOJ 520 最大素因子 快速線性篩法的變形

時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 greyants最近正在學習數論中的素數,但是現在他遇到了乙個難題 給定乙個整數n,要求我們求出n的最大素因子的序數,例如 2的序數是1,3的序數是2,5的序數是3,以此類推.研究數論是需要很大的耐心的,為了懲罰那些沒有耐心讀完...

NYOJ 458 解題報告

時間限制 1000 ms 記憶體限制 65535 kb 難度 1 描述 最近topcoder的xd遇到了乙個難題,倘若乙個數的三次方的後三位是111,他把這樣的數稱為小光棍數。他已經知道了第乙個小光棍數是471,471的三次方是104487111,現在他想知道第m m 10000000000 個小光...