尤拉篩應用 J Sum(DP思維)

2021-09-25 18:55:47 字數 1974 閱讀 5881

**中一般有兩個陣列,

從**中可以看到,外部的 i 是作為倍數使用,每次用素數更新合數時,都是在當前倍數 i

ii 下,乘以整個素數表 pri

me[]

prime

prime[

]。打個表看一下。

注意看為什麼 12 不被 3 x 4 更新。

i   素數表     所更新的合數22

4323

6942

38--->

// 不會更新 12, 因為 4 % 2 == 0,之後就 break了,52

351015

25// 而 12 應該被最小質因子 2 更新62

35127

2357

1421

354982

35716

9235

71827--

----

----

----

----

----

----

----

----

----

-當 i % prime [j]

==0 時,說明 i = k * prime[j]。

再往上更新時,要跟新的值 num = i * prime [j+1]。

這時發生了重複,因為 num = k * prime [j]

* prime [j+1]

= n * prime [j]

也就是 num 會被 prime[j] 乘以乙個 n 數給更新。

這樣就保證了被最小質因子更新

題意

定義 f(n

)f(n)

f(n)

表示整數 n

nn 能拆成幾對 n=a

∗b

n = a * b

n=a∗

b。其中要滿足 a,b

a, b

a,b 沒有平方數的因子。

求 ∑ i=

1nf(

i)

\sum_^ f(i)

∑i=1n​

f(i)

,( n≤

2⋅10

7)

\left(n \leq 2 \cdot 10^\right)

(n≤2⋅1

07)因為 n=a

∗b

n = a * b

n=a∗

b,且 a,b

a, b

a,b 沒有平方因子,即: a,b

a, b

a,b分解質因子之後沒有重複的。那麼 n

nn 的相同質因子個數不能超過 2

對質因子個數進行分類討論,算出 f(i

)f(i)

f(i)

即可。設 x=i

∗pri

me[j

]x = i * prime[j]

x=i∗pr

ime[

j]

#include

using namespace std;

typedef

long

long ll;

const

int inf =

0x3f3f3f3f

;const

int n =

2e7+5;

int _, n, cnt;

bool vis[n]

;int prime[n]

;int ans[n]

;void

isprime()

for(

int j =

0; j < cnt && prime[j]

* i < n; j++

)else}}

for(

int i =

1; i < n; i++)}

intmain()

return0;

}

尤拉函式尤拉篩

尤拉函式求小於等於n與n互質的數的個數 複習時發現這個知識點竟然沒有整理 n為素數即為n 1 除了其本身 n為素數的倍數 ola sushu j i ola i sushu j else ola sushu j i ola i sushu j 1 include include include in...

線性篩(尤拉篩)

昨天的考試跪的一塌糊塗 第一題水過,第二題帶wa的樸素,最後題忘了特判左端點全跪,分數比起預計得分整整打了個對折啊!步入正題 線性篩 尤拉篩 一般的篩法 ppt裡叫埃拉託斯特尼篩法,名字異常高貴 的效率是o nlglgn 其實很接近o n 啊!對於一些例如n 10000000的殘暴資料會跪,於是,線...

尤拉篩 線性篩

實現 include using namespace std const int max n 1e8 int prime max n cnt bool st max n 使用bool陣列節省空間 void is prime int n intmain 每個合數只被自己最小的質因子篩去。現在證明在i ...