**中一般有兩個陣列,
從**中可以看到,外部的 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 ...