牢騷和推導
忘記 \(\tt min\_25\) 了,重新推一遍,順便理清思路。
對於乙個函式 \(f(x)\),它是乙個積性函式,並且 \(f(p),f(p^k)\) 都比較好得到,現在問 \(f(i)=\sum_^nf(i)\).
對於 \(f\),我們分質數、合數與 \(1\) 三種情況考慮,就有
\[f(n)=\sum_^f(p_i)+\sum_^f(x)+f(1)
\]對於合數部分,我們改寫一下,有
\[\begin
&\sum_^f(x) \\
=&\sum_^\sum_^f(p_i^k)\left( \sum_(x)>p_i}^\right\rfloor}f(x)+[k\neq1]f(1) \right) \\
\end
\]然後我們定義 \(s(n,j)\) 表示所有 \((1,n]\) 以內的,最小質因數大於\(p_j\) 的數的函式值之和,那麼就有
對於這個 \(s\) 的求值,我們也可以分成質數、合數兩個部分考慮,定義 \(g(i)\) 表示 \([1,i]\) 中質數的函式值之和,那麼有
\[\begin
s(n,j)&=g(n)-g(j)+\sum_^\sum_^f(p_i^k)\left( \sum_(x)>p_i}^\right\rfloor}f(x)+[k\neq1]f(1) \right) \\
&=g(n)-g(j)+\sum_^\sum_^f(p_i^k)\left( s\left(\left\lfloor\right\rfloor,i\right)+[k\neq1]f(1) \right) \\
\end
\]這個東西就可以遞迴做了,但是還有乙個問題:這個 \(g\) 怎麼處理?
定義 \(g(i,j)\) 表示 \([2,i]\) 以內的質數或者最小質因數大於 \(p_i\) 的數的函式值之和,不難發現,有邊界情況
\[g(i,j)=
\begin
\sum_^if(k) &j=0 \\
g(i-1,j) &i
這個 \(g()\) 的遞推過程,我們可以考慮成每一次篩,其實就是將當前最小的質數所擁有的乙個合數篩掉,但是要注意篩這個質數的時候可能會把前面的質數重複篩,這個就要重新加上。至於為什麼這裡是 \(g\left(\left\lfloor\right\rfloor,j-1\right)\) 呢?因為我們是從 \(g(i,j-1)\) 中篩掉的,所以自然這裡也是 \(j-1\) 了。
然後我們一直推進,直到某個時刻 \(p_j=p\)(\(p\) 是 \(\sqrt n\) 以內最大的質因數)時,就有 \(g(n)=g(n,p)\).
最後實現的時候,每個 \(f()\) 拆出來的單獨的一項函式單獨用乙個 \(g()\) 進行計算,並且注意到這個遞推關係是相鄰之間的關係,所以只需要開一維陣列。
一些感悟
重新推了一遍,還花了比較久的時間,但是重新理了一遍思路。
對於 \(g\),我們實際上只是想要 "質數" 的部分,但是無奈不能一次解決,所以就變成了 "質數以及最大質因數大於 \(p_j\) 的數的函式值之和",然後通過每次將 \(p_j\) 變大,逐一篩去一些以質數為基礎的合數,最後得到我們想要的。
對於 \(s\),我們實際上想要的是 \(s(n,0)\),但是無奈這樣的數太多了,我們就只好先定義其為 "最小質因數大於 \(p_j\) 的數的函式值之和",然後每次放低要求,最後得到我們想要的。
也就是說,對於 \(g\) 而言,我們實際上每次在篩掉一些數,對於 \(s\),我們每次都在加入一些數。
突發奇想續
簡單寫了點 把那個方程組生成樹結構 code include include using namespace std enum type enum operator class variable variable const char name variable const variable var...
突發奇想 超越寶馬之後
前面開車的是個女的 一眼瞟到這個情況,我便作出了超車的決定。路上的車不多,前面幾輛車稀疏的併排,但是中間的空隙似乎不足夠進行大刀闊斧的超車動作。但是我終究還是超了 帶著一點點爭強好勝,一點點年輕人的血氣方剛。交通燈就像馬路上的革命者,對車流進行結構重組,對車群進行資源整合 大家又排到了十分相近的起點...
一次突發奇想
今天有個突發奇想 假如 有需要我們 暴力破解 而且必須和程式互動的時候 我們該怎麼辦 這個 有人和我說os 庫 但是 沒有知道怎麼用 我現在沒有解決 windows下的 dos 平台 如果有人知道了 可以在下面一起交流 先說linux 下的怎麼辦 這個 在我以前我也寫過 有用shell 但是如果不想...