從基礎數論函式說起1:整除分塊、數論函式、狄利克雷卷積
一部分數論題會問乙個數論函式的字首和,不妨令其為 \(s(n)=\sum\limits_^n f(i)\) 。有時直接求會比較困難。
杜教篩是通過構建乙個函式 \(g\) , \(f*g\) 的字首和能快速( \(o(1)\) )求出。這樣能在低於線性的複雜度內求解 \(s(n)\) 。
具體地來說就是:
\[\begin
\sum\limits_^\sum\limits_f(i)g(j)=\sum\limits_f(i)g(j)=\sum\limits_^n g(i)s(\lfloor\frac\rfloor)
\end
\]那麼
\[g(1)s(n)=\sum\limits_f(i)g(j)-\sum\limits_^ng(i)s(\lfloor\frac\rfloor)
\]好像還是沒有講清楚……
舉個例子:
比方說 \(f=\mu\) , \(s(n)=\sum\limits_^n f(i)\) 。那麼可以構造 \(g=id_0\) ,那麼有
\[g(1)s(n)=\sum\limits_^n (f*g)(i) - \sum\limits_^n g(1)s(\lfloor\frac\rfloor)
\]可以得到
\[s(n)=1-\sum_^n s(\lfloor\frac\rfloor)
\]計算 \(s(n)\) 的時候,需要知道 \(s(\frac),i\in (2, n)\) 。這個可以進行整除分塊。也就是說,假設我們已經知道了 \(s(1\cdots n-1)\) ,那麼計算 \(s(n)\) 的複雜度是 \(o(\sqrt)\) 的。
將 \(s(n)\) 分為兩部分考慮。 當 \(i\geqslant \sqrt\) 時, \(\frac\leqslant n\) 。那麼假設把 \(s(1\cdots\sqrt)\) 全算了,時間複雜度是 \(o(\sum\limits_^} \sqrt)\) 的。
再考慮 \(i\leqslant \sqrt\) 的情況。由於 \(\lfloor\frac\rfloor}\rfloor=\lfloor\frac\rfloor\) ,那麼下標大於 \(\sqrt\) 的 \(s\) 在遞迴過程中總共只會被訪問到 \(o(\sqrt)\) 個。那麼求出這 \(o(\sqrt)\) 個的時間複雜度是 \(o(\sum\limits_^} \sqrt})\) 。
後一部分的複雜度顯然大於前一部分。所以總的時間複雜度是
\]而實際上可以做得更好。前面計算第一部分的時候,假設了計算了所有的 \(s(1\cdots\sqrt)\) 。但最後計算的時候,仍然是捨去的。不妨考慮稍微多預處理一點,來換取總的較小的複雜度。
根據前人經驗,用線性篩預處理前 \(n^}\) 項。那麼預處理的時間複雜度是 \(o(n^})\) 。然後後面一部分的複雜度就變為了
\]由於上面提到的, \(\lfloor\frac\rfloor}\rfloor=\lfloor\frac\rfloor\) ,需要求出的 \(s\) 的下標都是 \(n\) 的約數。所以可以將下標大於 \(\sqrt\) 的 \(s\) 存在另乙個陣列的 \(\frac\) 裡。這樣就省去了 hash 或者 map 。
第一回 從有理數說起
數學中的數,就像物理中的時間一樣,人人都知道,唯獨專家們不這樣理解它.zorich 數學數學 從字面上理解就是研究 數 的學問.大多數人對自然數和整數有了一定的認識,但對有理數和無理數僅僅有一些模糊的認識.所以第一回就從有理數說起.人類認識數的過程可以看出文明發展的過程.原始人類進行打獵,需要把打獵...
從 物質決定意識 說起 2
7 實踐是檢驗理論的最好方法,把理論應用於解決實際問題,就產生了解決問題的方案。方案和理論不一樣,解決乙個實際問題可能有很多方案,但能被實際採用的只能是乙個或兩個。這就產生了乙個最好的方案是什麼,它又從何而來的問題。首先,乙個好的方案必須是邏輯上沒有漏洞的,方案本身不能有自相矛盾的地方。其次,好的方...
2 工廠模式 從賣肉夾饃說起
簡單列一下這個模式的家族 1 靜態工廠模式 2 簡單工廠模式 3 工廠方法模式 4 抽象工廠模式 是不是覺得,我勒個去,這工廠還能列出這麼多分類,哈哈,下面開始各個擊破。1 靜態工廠模式 這個最常見了,專案中的輔助類,textutil.isempty等,類 靜態方法。下面開始詳細介紹 略。2 簡單工...