埃氏篩法過程中,每個數會被其所有質因數篩一遍,導致o(n
logn
)o(nlogn)
o(nlog
n)的複雜度。
for
(int i =
2; i <= n; i++)if
(is_prime[i]&&(
long
long
)i * i <= n)
如果讓每個數隻被其最小的質數篩去,那麼就可以可以去掉log
nlogn
logn
的複雜度.
具體的做法是,從2列舉每個自然數,先確定其是否是質數(並將質數從小到大存在 prpr
pr陣列中),然後找到其最小的質因數lplp
lp。在[ 2,
lp
][2,lp]
[2,lp]
範圍內從小到大列舉所有已篩得的質數prj
pr_j
prj
,將對應的i⋅p
ri
i\cdot pr_i
i⋅pri
的最小質因數設為pri
pr_i
pri
。可以證明這樣是對的,因為pri
pr_i
pri
小於i的最小質因子,所以i⋅p
ri
i\cdot pr_i
i⋅pri
的最小質因數只能是pri
pr_i
pri
。
vector<
int> pr;
void
sieve_pr()
for(
int j =
0; j <
(int
)pr.
size()
&& pr[j]
<= lp[i]
&& i*pr[j]
<= n;
++j)
lp[i * pr[j]
]= pr[j];}
}
(pc
)f(p^c)
f(pc)即f(p
c∗x)
f(p^c*x)
f(pc∗x
).f (p
c∗x)
=f(p
c)∗f
(x
)f(p^c*x)=f(p^c)*f(x)
f(pc∗x
)=f(
pc)∗
f(x)
篩μ
\muμ
令p
ip_i
pi為小於i最小質因子的所有質數。根據莫比烏斯函式的定義有:
μ (p
)=−1
μ(pk
)=
0\mu(p)=-1 \\ \mu(p^k)=0
μ(p)=−
1μ(p
k)=0
得 &\mu(p_i*i)=0&\mathrm\ [p_i|i]\\ else&\mu(p_i*i)=-\mu(p_i)& \end
for(
int j =
0; j <
(int
)pr.
size()
&& pr[j]
<= lp[i]
&& i*pr[j]
<= n;
++j)
}}篩φ
\varphi
φ 根據φ(p
)=p−
1ϕ(p
k)=p
k−pk
−1
\varphi(p)=p-1\\ \phi(p^k) = p^k - p^\\
φ(p)=p
−1ϕ(
pk)=
pk−p
k−1有
&\varphi(p_i*i)=\varphi(i)*p_i\ \mathrm\ \ [p_i|i]\\ else&\varphi(p_i*i)=\varphi(i)*(p_i-1) \end
for(
int j =
0; j <
(int
)pr.
size()
&& pr[j]
<= lp[i]
&& i*pr[j]
<= n;
++j)
}}當然時間允許可以直接寫埃氏篩:
φ (n
)=n∏
p∣n(
1−1p
)\varphi(n)=n\prod_\left(1-\frac\right)
φ(n)=n
p∣n∏
(1−
p1)
void
geteuler()
}
知識點 線性代數
研究物件 向量 矩陣 行列式 線性 一次形式來表達的 代數 符號替代元素和運算 pdf 線性代數的幾何意義 向量的矩陣表示法,向量的模,單位向量,法向量 在自由向量的意義下,相等的向量都看作是同乙個向量。數學中只研究自由向量。已知兩個非零向量a,b,作oa a,ob b,則 aob稱作向量a和向量b...
多執行緒重要知識點 執行緒同步
當多個執行緒同時共享同乙個全域性變數或靜態變數,做寫的操作時,可能會發生資料衝突問題,也就是執行緒安全問題。但是做讀操作是不會發生資料衝突問題。舉例 兩個視窗同時售賣100張火車票。解決方法 使用多執行緒之間同步或使用鎖 lock 原理 將可能會發生資料衝突問題 執行緒不安全問題 只能讓當前乙個執行...
C 知識點 執行緒2 執行緒管理
執行緒管理就是使用join或detach來管理執行緒。第乙個版本,注意在異常中增加對執行緒的join include include using namespace std void function 1 std cout第二個版本,包一層 include include using namespa...