定義\(\pi_k(n)\)為質數的\(k\)次冪字首和函式,即\(\pi_k(n)=\sum_p^k\)。特別地,\(\pi_0(n)=\pi(n)\),為質數計數函式。求\(\pi_k(n)\)。(若無特殊說明,下文中單獨出現的\(p\)、\(q\)均為質數)
定義那麼
\[\phi_k(n,a)=\sum_p_(n,a)
\]考慮素數\(b=p_a\),當\(n^\frac\leq b\leq n^\frac\)時,有
\[\phi_k(n,a)=p_(n,a)+p_(n,a)+p_(n,a)=1+\pi_k(n)-\pi_k(p_a)+p_(n,a)
\]於是
\[\pi_k(n)=\phi_k(n)-p_(n,a)+\pi_k(p_a)-1
\]故只需要分別計算\(\pi_k(p_a)\)、\(p_(n,a)\)、\(\phi_k(n,a)\)即可。
對於\(\pi_k(p_a)\)。線性篩即可。時間複雜度\(o(b)\)。
對於\(p_(n,a)\)。根據定義有
\[p_(n,a)=\sum_}(pq)^k
\]注意到\(b< p\leq q< \left\lfloor\frac\right\rfloor\),於是線性篩預處理,然後列舉\(p\)計算所有可行的\(q\)的貢獻,為
\[p_(n,a)=\sum_}p^k\left(\pi_k\left(\left\lfloor\frac\right\rfloor\right)-\pi_k(p-1)\right)
\]時間複雜度\(o(\frac)\)。
對於\(\phi_k(n,a)\)。根據容斥,容易得到遞推式
\[\phi_k(n,a)=\phi_k(n,a-1)-p_a^k\phi\left(\left\lfloor\frac\right\rfloor,a-1\right)
\]邊界條件為
\[\phi_k(n,0)=s_k(n)
\]考慮dfs計算該式。
若每次都遞推到邊界,有
\[\phi_k(n,a)=\sum_\mu(x)x^ks_k\left(\left\lfloor\frac\right\rfloor\right)
\]複雜度難以接受,考慮剪枝。
加入\(x> b\)時停止遞迴的剪枝,有
\[\phi_k(n,a)=\sum_\mu(n)x^ks_k\left(\left\lfloor\frac\right\rfloor\right)+\sum_\leq b< x}\mu(x)x^k\phi_k\left(\left\lfloor\frac\right\rfloor,\pi(\delta(x))-1\right)\]令
\[\mathcal=\sum_\mu(n)x^ks_k\left(\left\lfloor\frac\right\rfloor\right)
\]\[\mathcal=\sum_\leq b< x}\mu(x)x^k\phi_k\left(\left\lfloor\frac\right\rfloor,\pi(\delta(x))-1\right)
\]那麼
\[\phi_k(n,a)=\mathcal+\mathcal
\]對於\(\mathcal\),線性篩預處理後\(o(b)\)計算即可。
對於\[\mathcal=-\sum_\sum_}\mu(x)p^kx^k\phi_k\left(\left\lfloor\frac\right\rfloor,\pi(p)-1\right)
\]分塊計算。
令\[\mathcal=-\sum_< p\leq b}\sum_}\mu(x)p^kx^k\phi_k\left(\left\lfloor\frac\right\rfloor,\pi(p)-1\right)
\]\[\mathcal=-\sum_< p\leq n^\frac}\sum_}\mu(x)p^kx^k\phi_k\left(\left\lfloor\frac\right\rfloor,\pi(p)-1\right)
\]\[\mathcal=-\sum_}\sum_}\mu(x)p^kx^k\phi_k\left(\left\lfloor\frac\right\rfloor,\pi(p)-1\right)
\]那麼
\[\mathcal=\mathcal+\mathcal+\mathcal
\]對於\(\mathcal,\mathcal\),注意到\(\delta(x)> p> n^\frac\)且\(x\leq b\leq n^\frac\)。於是\(x\)只能為質數。
於是\[\mathcal=\sum_< p\leq b}\sum_p^kq^k\phi_k\left(\left\lfloor\frac\right\rfloor,\pi(p)-1\right)
\]\[\mathcal=\sum_< p\leq n^\frac}\sum_p^kq^k\phi_k\left(\left\lfloor\frac\right\rfloor,\pi(p)-1\right)
\]對於\(\mathcal\)。由於\(\left\lfloor\frac\right\rfloor< n^\frac< p\),所以\(\phi_k\left(\left\lfloor\frac\right\rfloor,\pi(p)-1\right)=1\)
於是\[\mathcal=\sum_< p\leq b}\sum_p^kq^k=\sum_< p\leq b}p^k(\pi_k(b)-\pi_k(p))
\]時間複雜度\(o(b)\)。
對於\(\mathcal\),考慮分成兩個部分計算。令
\[\mathcal=\sum_< p\leq n^\frac}\sum_}}p^kq^k\phi_k\left(\left\lfloor\frac\right\rfloor,\pi(p)-1\right)
\]\[\mathcal=\sum_< p\leq n^\frac}\sum_}}p^kq^k\phi_k\left(\left\lfloor\frac\right\rfloor,\pi(p)-1\right)
\]那麼\(\mathcal=\mathcal+\mathcal\)。
對於\(\mathcal\),因為\(q> \frac\),所以有\(p> \sqrt}\geq \sqrt}\)。同時,由於\(\left\lfloor\frac\right\rfloor,所以\(\phi_k\left(\left\lfloor\frac\right\rfloor,\pi(p)-1\right)=1\)。
於是\[\mathcal=\sum_}< p\leq n^\frac}\sum_}}p^kq^k=\sum_}< p\leq n^\frac}p^k\left(\pi_k(b)-\pi_k\left(\min\left\\right\rfloor\right\}\right)\right)
\]時間複雜度\(o(b)\)。
對於\(\mathcal\),我們有\(p\leq \frac< \sqrt< p^2\),所以\(\phi_k\left(\left\lfloor\frac\right\rfloor,\pi(p)-1\right)=1+\pi_k\left(\left\lfloor\frac\right\rfloor\right)-\pi_k(p)+p^k\)。
於是把\(\mathcal\)分成兩個部分計算。令
\[\mathcal=\sum_< p\leq n^\frac}p^k(1-\pi_k(p)+p^k)\sum_}}q^k
\]\[\mathcal=\sum_< p\leq n^\frac}p^k\sum_}}q^k\pi_k\left(\left\lfloor\frac\right\rfloor\right)
\]那麼\(\mathcal=\mathcal+\mathcal\)。
對於\(\mathcal\),直接列舉\(p\)計算即可。
對於\(\mathcal\),用類似數論分塊的方法計算。列舉\(p\),對於所有\(\pi_k\left(\left\lfloor\frac\right\rfloor\right)\)相同的\(q\)一起統計貢獻,可以證明最多只有\(\pi\left(\left\lfloor\frac\right\rfloor\right)\),個狀態。於是時間複雜度為\(o\left(\frac}\right)\)。
對於\(\mathcal\),列舉\(p\),用樹狀陣列統計其對所有有用的\(\phi_k\)的貢獻。時間複雜度為\(o\left(\frac\log n\right)\)。
取\(b=o(n^\frac\log^2 n)\)時總複雜度達到最優,為\(o\left(\frac}\right)\)。
(將\(\mathcal\)分成5個部分計算可進一步將時間複雜度優化至\(o\left(\frac}\right)\),在此不過多敘述)。
(實際上由於常數原因,在\(n\leq 10^\)範圍內跑得不如\(o\left(\frac}\right)\)的遞推做法或\(o(n^\frac)\)的樹狀陣列優化做法快)。
**咕咕咕。
演算法基礎( 演算法)
演算法基礎 演算法 hash演算法有兩種,即sha 1和md5演算法這裡先介紹md5演算法.md5產生乙個128位的hash值,在經過一寫初始樹立後,將明文分成了512位的塊,再將每一塊分成16個32位的子塊。演算法的輸出是4個32位的塊,連線起來構成128位的hash值。首先,將訊息填充到比512...
演算法 分治演算法
分治策略主要利用遞迴來解決問題,它包括以下三個步驟 分解 將問題分解為一與原問題類似並且比原問題規模更小的子問題 解決 當分解的子問題足夠小時,直接給出答案,否則用遞迴打方式求解 合併 將子問題的解合成原問題的解 下面考慮乙個簡單的利用分治演算法的歸併排序的例子 問題的形式化描述如下 輸入 a是 乙...
演算法 遞迴演算法
遞迴演算法的概念,就是通過不斷地呼叫自身,最終達到解決問題的目的。遞迴有兩個點需要注意 1.要不斷的呼叫自身 2.這個遞迴要有出口,不能成為死迴圈 看下面的例子。很多介紹遞迴演算法的,都會用遞迴來做乙個題目 計算乙個數的階層。例如 計算5的階層,5 5 x 4 x 3 x 2 x 1 用遞迴來實現 ...