2018 icpc南京賽區網路賽 J題 附模板

2021-08-26 17:51:55 字數 1076 閱讀 3040

求前1~n每個數的分解的非平方因子數乘積方式的和

用修改的線性篩做

a[i]表示數i的分解方法數,對每個數多試幾組資料可以發現:

1.質數的分解方法數始終為2;

2.合數的分解方法數為其兩因子數的分解方法數的乘積

若該合數為平方數,則分解方法數要除4

若該合數的其中乙個因子是n次方數(n≥3),則分解方法數為0

由於這題資料非常多(2e7),所以用線性篩不會超時,隨著線性篩的進行順便就把每個數的分解方法數都加上去了,這樣時間複雜的還是o(n)

還是要對線性篩的原理及其篩的具體細節熟悉才行

#include#include#include#includeusing namespace std;

const int n=2e7+7;

int a[n];

int prime[n];

int sum[n];

int main()

//標記目前得到的素數的i倍為非素數

for(int j=0; j線性篩 時間複雜度:o(n)

這種方法比較好理解,初始時,假設全部都是素數,當找到乙個素數時,顯然這個素數乘上另外乙個數之後都是合數

把這些合數都篩掉,即演算法名字的由來。但仔細分析能發現,這種方法會造成重複篩除合數,影響效率。

比如10,在i=2的時候,k=2*15篩了一次;在i=5,k=5*6 的時候又篩了一次。所以,也就有了快速線性篩法。

利用了每個合數必有乙個最小素因子。每個合數僅被它的最小素因子篩去正好一次。所以為線性時間。

**中體現在:

if(i%prime[j]==0)break;

prime陣列 中的素數是遞增的,當 i 能整除 prime[j],那麼 i*prime[j+1] 這個合數肯定被 prime[j] 乘以某個數篩掉。

因為i中含有prime[j], prime[j] 比 prime[j+1] 小。接下去的素數同理。所以不用篩下去了。

在滿足i%prme[j]==0這個條件之前以及第一次滿足改條件時,pr[j]必定是pr[j]*i的最小因子(可以自己輸出一下prime[j]中每個數的值,會發現i(或者是prime[j]的值)比j要大很多)

2018 icpc 南京網路賽

題目 鏈結 a.an olympian math problem 輸出n 1即可 女朋友猜的 includeusing namespace std define ll long long ll fac 103 int main for int i 1 i m i ll ans 0 for int i...

2018 ICPC 南京網路賽 skr

題意 給出乙個字串,求它的所有回文子串轉化成數字的和,對1e9 7取模。題解 先上manacher,然後列舉每個點,按照半徑從大到小的順序列舉回文串,遇到出現過的就break,統計答案即可。注意的是,判重時只能用pb ds中的gp hash table,unordered map會t,同時需要兩個字...

ICPC 南京賽區網路賽 A

題目大意就是,給你乙個數n 然後給你乙個公式求s,讓你輸出s n 這個題目不用想,直接用用題目中的公式暴力寫肯定超時 可以先手算簡化一下公式 n 1 n 1 n n 1 n 1 n!n 1 所以可得 s 1 1!n 1 n 1 2!1!3!2!n!n 1 n 1 所以s n n 1 n n 是n的倍...