積性函數前綴和-我的總結

積性函數前綴和-我的總結

【寫在前面】

​ 用了一個多星期將這部分大體弄懂了,東西太多,有不少技巧,本身從新寫了一下,記錄本身的理解。內容與原文基本一致,在其基礎上加上了一些我感受比較重要的但他沒有詳細說明的東西。如下都是我逐字打出來的。若是有什麼錯誤,請指出。——Simonios

前置技能裏面的東西須要充分理解和記憶,在後面推導過程當中會屢次用到前置技能裏面的東西。c++

轉載出處:數組

author: skywalkert
original article: http://blog.csdn.net/skywalkert/article/details/50500009網絡

【經常使用技巧】

\[ \sum_{k=1}^n\sum_{d|k}d\cdot k=\sum_{k=1}^n\sum_{d=1}^{\frac nk}d\cdot k\cdot d=\sum_{d=1}^n\sum_{k|d}d\cdot \frac dk=\sum_{d=1}^n\sum_{k=1}^{\frac nd}d\cdot k\cdot d=\sum_{d=1}^n\sum_{d|k}d\cdot k=\sum_{k=1}^n\sum_{k|d} d\cdot\frac dk\\ 上式爲約數,倍數之間重要的變換,須要充分理解並熟練運用。\\ \\一、遇到[gcd(i,j)=1],考慮將其轉換爲\sum_{k|gcd(i,j)}\mu(k)\\ 二、對於\sum_{i=1}^n\sum_{j=1}^n[gcd(i,j)=1]=2\sum_{i=1}^n\sum_{j=1}^i[gcd(i,j)=1]-\sum_{i=1}^n[gcd(i,i)=1]=\big(2\sum_{i=1}^n\varphi(i)\big)-1\\ 三、\sum_{i=1}^{n}i\sum_{j=1}^{n}[gcd(i,j)=1]\cdot j=2\sum_{i=1}^{n}i\sum_{j=1}^i[gcd(i,j)=1]\cdot j-\sum_{i=1}^n[gcd(i,i)=1]\cdot i\\ =\bigg(2\sum_{i=1}^ni\frac{i\cdot\varphi(i)+[i=1]}{2}\bigg)-1=\bigg(\sum_{i=1}^ni^2\cdot\varphi(i)+[i=1]\bigg)-1\\ 四、記w(n)爲n的質因子個數,則2^{w(n)}爲n的約數中無平方因子的個數,則f(n)=2^{w(n)}=\sum_{d|n}\mu^2(d)\\ 則\sigma_0(n^2)=\sum_{d|n}f(d)=\sum_{d|n}\sum_{k|d}\mu^2(k),附個表\sum_{i=1}^{10}\sigma(i^2)\\ 五、n之內非徹底平方數的個數g(n)=\sum_{i=1}^n\mu^2(i)=\sum_{i=1}^{\sqrt{n}}\mu(i)\cdot\lfloor\frac n{i^2}\rfloor\\ 六、\sum_{d|n}\sum_i^{\frac{n}{d}}=\sum_{d|n}\sum_i^{d},且d|n能夠用埃篩預處理,i爲d,j爲n。\\ 七、\sigma_0(i\cdot j)=\sum_{d|i\cdot j}=\sum_{x|i}\sum_{y|j}[gcd(i,j)=1],\sigma_1(i\cdot j)=\sum_{d|i\cdot j}d=\sum_{x|i}\sum_{y|j}\frac{y\cdot n}{x}[gcd(i,j)=1] \\八、若a>b,\ gcd(a,b)=1,則有gcd(a^m-b^m,a^n-b^n)=a^{gcd(n,m)}-b^{gcd(n,m)}。 \]函數

證實7:
\[ 令x=i\cdot j,則由惟一分解定理得:x=p_1^{e_1}p_2^{e_2}\dots p_n^{e_k},則x的約數個數爲(e_1+1)\cdot(e_2+1)\dots(e_k+1)\\ 考慮任意一個質數p對答案的貢獻。假設質數p在i的質因數中出現了a次,在j的質因數中出現了b次,那麼p對答案\\的貢獻就爲a+b+1。而a+b+1=\sum_{x=0}^a\sum_{y=0}^b[gcd(p^x,p^y)=1],等效與如下矩陣:a=2,b=3\\ \left(\begin{matrix} 1&1&1&1\\ 1&p&p&p\\ 1&p&p^2&p^2 \end{matrix}\right)\\ 至關於對於素數p來講,不一樣時出現於兩個數的質因數中。 \\ 由惟一分解定理又得:i=p_1^{e_1}p_2^{e_2}p_3^{e_3}...p_k^{e_k},j=p_1^{q_1}p_2^{q_2}p_3^{q_3}...p_k^{q_k},根據乘法原理可得:\\ \sigma_0(i\cdot j)=\sum_{x_1=0}^{e_1}\sum_{y_1=0}^{q_1}[(p_1^{x_1},p_1^{y_1})=1]\sum_{x_2=0}^{e_2}\sum_{y_2=0}^{q_2}[(p_2^{x_2},p_2^{y_2})=1]...\sum_{x_n=0}^{e_n}\sum_{y_n=0}^{q_n}[(p_n^{x_n},p_n^{y_n})=1]\\將其合併得:\sigma_0(i\cdot j)=\sum_{x|i}\sum_{y|j}[gcd(x,y)=1]\\ 對於任意一個素數p來講,它們不一樣時出現於x,y中,就至關於gcd(x,y)=1。 \]優化


\[ \sigma_1(n\cdot m)=\sum_{a|n\cdot m}a\\=\sum_{k=1}^r\sum_{c\big|\frac{nm}{P_k^{x_k+y_k}}}\sum_{a|P_k^{x_k+y_k}}ac\\=\sum_{a_1\big|P_1^{x_1+y_1}}\sum_{a_2\big|P_2^{x_2+y_2}}...\sum_{a_r\big|P_r^{x_r+y_r}}\Big(\prod_{i=1}^ra_i\Big) \\對於某個素數p_k: \sum_{a\big | P_k^{x_k+y_k}}a=\sum_{a|P_{k}^{x_k}}\sum_{b|P_{k}^{y_k}}[ gcd(a,b)=1]\frac{P_{k}^{x_k}b}{a}\\因此:\sigma_1(n\cdot m)=\sum_{a|n}\sum_{b|m}\frac{n\cdot b}{a}[gcd(a,b)=1] \]es5

二、
10
1 1 1 1 1 1 1 1 1 1
1 0 1 0 1 0 1 0 1 0
1 1 0 1 1 0 1 1 0 1
1 0 1 0 1 0 1 0 1 0
1 1 1 1 0 1 1 1 1 0
1 0 0 0 1 0 1 0 0 0
1 1 1 1 1 1 0 1 1 1
1 0 1 0 1 0 1 0 1 0
1 1 0 1 1 0 1 1 0 1
1 0 1 0 0 0 1 0 1 0

四、
1                                           1
1 2 4                                       1 1 2
1 3 9                                       1 1 3
1 2 4 8 16                                  1 1 2 1 2
1 5 25                                      1 1 5
1 2 3 4 6 9 12 18 36                        1 1 2 1 3 1 2 3 6
1 7 49                                      1 1 7
1 2 4 8 16 32 64                            1 1 2 1 2 1 2
1 3 9 27 81                                 1 1 3 1 3
1 2 4 5 10 20 25 50 100                     1 1 2 1 5 1 2 5 10  
48                                          48

【前置技能】

【積性函數的定義】

  1. \(f(n)\)的定義域爲正整數域,值域爲複數,即\(f:Z^+→C\),則稱\(f(n)\)數論函數
  2. \(f(n)\)爲數論函數,且\(f(1)=1\),對於互質的正整數\(p,q\)\(f(p⋅q)=f(p)⋅f(q)\),則稱其爲積性函數
  3. \(f(n)\)爲積性函數,且對於任意正整數\(p,q\)都有\(f(p⋅q)=f(p)⋅f(q)\),則稱其爲徹底積性函數

【積性函數的性質與例子】

  1. \(f(n)\)爲積性函數,則對於正整數\(n=\prod_{i=1}^tp_i^{e_i}\)\(f(n)=\prod_{i=1}^tf(p_i^{e_i})\);若f(n)爲徹底積性函數,則對於正整數\(n=\prod_{i=1}^tp_i^{e_i}\)\(f(n)=\prod_{i=1}^tf(p_i)^{e_i}\)
  2. 常見的積性函數有:
    1. 除數函數\(\sigma_k(n)=\sum_{d|n}d^k\),表示n的約數的k次冪和,注意\(\sigma_k(n)\)\(\sigma^k(n)\)是不一樣的。
      • 由惟一分解定理得:\(n=\prod_{i=1}^tp_i^{e_i}\)。則\(\sigma_k(n)=\prod_{i=1}^t\sigma_k(p_i^{e_i})=\prod_{i=1}^t \sum_{d|p_i^{e_i}}d^k=\prod_{i=1}^t(1+p^k+p^{2k}+p^{3k}+\dots+p^{e_ik})\)
    2. 約數個數函數\(τ(n)=σ_0(n)=∑_{d|n}1\),表示\(n\)的約數個數,通常也寫爲\(d(n)\)
      • \(\sigma_0(n)=\prod_{i=1}^t\sigma_0(p_i^{e_i})=\prod_{i=1}^t(1+p^0+p^0+p^0+\dots+p^{0})=\prod_{i=1}^te_i+1\)
    3. 約數和函數\(σ(n)=σ_1(n)=∑_{d|n}d\),表示\(n\)的約數之和。
      • \(\sigma_1(n)=\prod_{i=1}^t(1+p^1+p^2+p^3+\dots+p^{e_i})\)\(ps:\)括號內的能夠用等比數列求和公式簡化。
    4. 歐拉函數\(\varphi(n)=\sum_{i=1}^n[(n,i)=1]\cdot1\),表示不大於\(n\)且與\(n\)互質的正整數的個數,另外\(\sum_{i=1}^n[(n,i)=1]\cdot i=\frac{n\cdot \varphi(n)+[n=1]}2\),且對於正整數\(n>2\)來講\(\varphi(n)\)是偶數。
      • \(n\ne1時,2\sum_{i=1}^n[(n,i)=1]\cdot i=\sum_{i=1}^n[(n,i)=1]\cdot i+\sum_{i=1}^n[(n,i)=1]\cdot(n-i)=\\ \sum_{i=1}^n[(n,i)=1]\cdot n=n\sum_{i=1}^n[(n,i)=1]=n\cdot\varphi(n),則\sum_{i=1}^n[(n,i)=1]\cdot i=\frac{n\cdot \varphi(n)}{2}\)
    5. 莫比烏斯函數\(μ(n)\),在狄利克雷卷積的乘法中與恆等函數互爲逆元,\(μ(1)=1\),對於無平方因子數\(n=∏^t_{i=1}p_i\)\(μ(n)=(−1)^t\),對於有平方因子數\(n\)\(μ(n)=0\)
    6. 元函數 \(e(n)=[n=1]\),狄利克雷卷積的乘法單位元,徹底積性。
    7. 恆等函數\(I(n)=1\),徹底積性。
    8. 單位函數\(id(n)=n\),徹底積性。
    9. 冪函數\(id^k(n)=n^k\),徹底積性。
  3. 關於莫比烏斯函數和歐拉函數有兩個經典的公式
    • \([n=1]=∑_{d|n}μ(d)\),將\(μ(d)\)看做是容斥的係數便可證實。
    • \(n=∑_{d|n}φ(d)\),將\(\frac in(1≤i≤n)\)化爲最簡分數統計個數便可證實。

【狄利克雷卷積與莫比烏斯反演】

  1. 數論函數\(f\)\(g\)狄利克雷卷積定義爲\((f∗g)(n)=∑_{d|n}f(d)⋅g(\frac nd)\),狄利克雷卷積知足交換律\(((f*g)(n)=(g*f)(n)=\sum_{d|n}g(d)f(\frac nd))\)、結合律\((f*g*h=f*(g*h))\),對加法知足分配律,存在單位元函數\(e(n)=[n=1]\)使得\(f∗e=f=e∗f\),若\(f\)\(g\)爲積性函數則\(f∗g\)也爲積性函數。
  2. 狄利克雷卷積的一個經常使用技巧是對於積性函數\(f\)與恆等函數\(I\)的卷積的處理,例如\(n=\prod_{i=1}^tp_i^{e_i},(f*I)(n)=\sum_{d|n}f(d)I(\frac nd)=\sum_{d|n}f(d)=\prod_{i=1}^t\sum_{j=0}^{e_i}f(p_i^j)\)
  3. 莫比烏斯反演也是對於\(g(n)=∑_{d|n}f(d)(g=f*I)\) 的討論,可是不要求\(f\) 是積性函數,適用於已知\(g(n)\)\(f(n)\) 的狀況,因爲\((I*\mu)(n)=\sum_{d|n}\mu(d)=e(n)\),則\(g*\mu=(f*I)*\mu=f*(I*\mu)=f*e=f\),即若\(g=f*I\),則\(f(n)=(g*\mu)(n)=\sum_{d|n}g(d)\cdot\mu(\frac nd)\),相似的有\(g(n)=\sum_{n|d}f(d)\Rightarrow f(n)=\sum_{n|d}g(d)\cdot\mu(\frac dn)\),二項式反演也是相似的技巧。有一個例子能夠看出歐拉函數和莫比烏斯函數之間的關係,因爲\(\sum_{d|n}\varphi(d)=id(n)\),因此\(\varphi(n)=\sum_{d|n}\mu(d)\cdot\frac nd\),即\(\frac{\varphi(n)}n=\sum_{d|n}\frac{\mu(d)}d\)

【正文:黑科技】

這種黑科技在低於線性時間的複雜度下解決一類積性函數的前綴和問題。spa

首先看一個簡單的例子,求前\(n\)個正整數的約數之和,即\(∑^n_{i=1}σ(i)\),其中\(n≤10^{12}\)。顯然不能直接作了,可是咱們能夠推導一番:
\[ 方法1:\sum_{i=1}^n\sigma(i)=\sum_{i=1}^n\sum_{d|i}d=\sum_{d=1}^nd\sum_{i=1}^\frac nd=\sum_{i=1}^ni\cdot\lfloor\frac ni\rfloor\\ 方法2:\sum_{i=1}^n\sigma(i)=\sum_{i=1}^n\sum_{d|i}d=\sum_{i=1}^n\sum_{d=1}^{\frac ni}d=\sum_{i=1}^n\frac{\lfloor\frac ni\rfloor\cdot (\lfloor\frac ni\rfloor+1)}{2} \]
​ 當\(i\le \sqrt{n}\)時,\(\lfloor\frac ni \rfloor\)顯然只有\(O(\sqrt{n})\)個取值;當\(i\ge\sqrt{n}\)一樣;對於固定的\(\lfloor\frac ni\rfloor\)\(i\)的取值是一段連續的區間,這段區間是\([\bigg\lfloor\frac{n}{\lfloor\frac ni \rfloor+1}\bigg\rfloor+1,\bigg\lfloor\frac{n}{\lfloor\frac ni \rfloor}\bigg\rfloor ]\),所以能夠\(O(\sqrt{n})\)求得。例\(n=10\)時:\(\sum_{i=1}^n\sigma(i)=1\times10+2\times5+3\times3+4\times2+5\times2+6\times1+7\times1+8\times1+9\times1+10\times1\),則\(\sum_{i=1}^n\sigma(i)=10\times1+5\times2+3\times3+2\times(4+5)+1\times(6+7+8+9+10)\).net


求前n個正整數的約數個數之和也相似:
\[ \sum_{i=1}^n\sigma_0(i)=\sum_{i=1}^n\sum_{d|n}1=\sum_{d=1}^n\sum_{i=1}^\frac nd1=\sum_{d=1}^n\lfloor\frac nd\rfloor \]code


如今咱們來加大一點難度,(51Nod 1239)求前\(n\)個正整數的歐拉函數之和,即\(\Phi(n)=∑^n_{i=1}φ(i)\),其中\(n≤10^{11}\)

對於\(\varphi(i)\),咱們知道\(\sum_{d|n}\varphi(d)=n\),即\((\varphi*I)(n)=\sum_{d|n}\varphi(d)I(\frac nd)=\sum_{d|n}\varphi(d)=n\),則
\[ \frac{n\cdot(n+1)}{2}=\sum_{i=1}^ni=\sum_{i=1}^n(\varphi*I)(i)=\sum_{i=1}^n\sum_{d|n}\varphi(d)=\sum_{i=1}^n\sum_{d=1}^{\frac ni}\varphi(d)=\sum_{i=1}^n\Phi(\lfloor\frac ni\rfloor) \]

對於\(\sum_{i=1}^n\Phi(\lfloor\frac ni\rfloor)\),若是\(i=1\)則便是咱們要求的\(\Phi(n)\)
\[ 則\Phi(n)=\sum_{i=1}^n\Phi(\lfloor\frac ni\rfloor)-\sum_{i=2}^n\Phi(\lfloor\frac ni\rfloor)=\frac{n\cdot (n+1)}2-\sum_{i=2}^n\Phi(\lfloor \frac ni\rfloor) \]
因爲\(\Phi(n)\)是一個積性函數的前綴和,因此篩法也能夠預處理一部分。因此總複雜度爲\(O(n^{\frac 23})\)


若是能經過狄利克雷卷積構造一個更好計算前綴和的函數,且用於卷積的另外一個函數也易計算,則能夠簡化計算過程。例如上題就是利用了\(φ∗I=id\)的性質,但必定注意,不是全部的這一類題都只用配個恆等函數\(I\)
就能夠輕鬆完事的,有時須要更細緻的觀察。


(51Nod 1244)定義梅滕斯函數\(M(n)=∑^n_{i=1}μ(i)\),給定正整數\(n\),計算\(M(n)\)其中\(n≤10^{11}\)。能夠利用\(\mu*I=e\)的性質簡化

對於\(\mu(i)\),有\(\sum_{d|n}\mu(d)=[n=1]\),則\((\mu*I)(n)=\sum_{d|n}\mu(d)I(\frac nd)=[n=1]\),則
\[ 1=\sum_{i=1}^n[i=1]=\sum_{i=1}^n(\mu*I)(i)=\sum_{i=1}^n\sum_{d|n}\mu(d)=\sum_{i=1}^n\sum_{d=1}^{\frac ni}\mu(d)=\sum_{i=1}^nM(\lfloor\frac ni \rfloor)\\ 同理得: M(n)=\sum_{i=1}^nM(\lfloor\frac ni \rfloor)-\sum_{i=2}^nM(\lfloor \frac ni\rfloor)=1-\sum_{i=2}^nM(\lfloor\frac ni \rfloor) \]
同理複雜度爲\(O(n^{\frac 23})\)


(51Nod 1237)定義最大公約數之和的函數\(G(n)=\sum_{i=1}^n\sum_{j=1}^ngcd(i,j)\),給定正整數n,計算\(G(n)\)其中\(n\le10^{10}\)
\[ 方法1:G(n)=\sum_{i=1}^n\sum_{j=1}^ngcd(i,j)=\sum_{i=1}^n\sum_{j=1}^n\sum_{d=1}^n[gcd(i,j)=d]\cdot d=\sum_{d=1}^n\sum_{i=1}^{\frac nd}\sum_{j=1}^{\frac nd}[gcd(i,j)=1]\cdot d\\ 由於[gcd(i,j)=1]=\sum_{k|gcd(i,j)}\mu(k) \\ 則G(n)=\sum_{d=1}^n\sum_{i=1}^{\frac nd}\sum_{j=1}^{\frac nd}\sum_{k|gcd(i,j)}\mu(k)\cdot d=\sum_{k=1}^n\mu(k)\sum_{d=1}^{n}d\sum_{i=1}^{\frac n{kd}}\sum_{j=1}^{\frac n{kd}}1=\sum_{k=1}^n\mu(k)\sum_{d=1}^{ n}d\cdot\lfloor\frac n{kd}\rfloor^2\\ 令T=dk, 則得\sum_{T=1}^n\lfloor\frac n{T}\rfloor ^2\sum_{d|T}d\cdot\mu(\frac Td)\\ 再由n=id(n)=\sum_{d|n}\varphi(d), 則由莫比烏斯反演得\varphi(n)=\sum_{d|n}id(d)\cdot\mu(\frac nd)=\sum_{d|n}d\cdot\mu(\frac nd)\\ 則得\sum_{T=1}^n\lfloor\frac{n}{T}\rfloor^2\varphi(T),剩下就是求歐拉函數前綴和了。 \]


\[ 方法2:G(n)=\sum_{i=1}^n\sum_{j=1}^ngcd(i,j)=\sum_{i=1}^n\sum_{j=1}^n\sum_{d=1}^n[gcd(i,j)=d]\cdot d=\sum_{d=1}^n\sum_{i=1}^{\frac nd}\sum_{j=1}^{\frac nd}[gcd(i,j)=1]\cdot d\\ \sum_{d=1}^nd\sum_{i=1}^{\frac nd}\sum_{j=1}^{\frac nd}[gcd(i,j)=1]=\sum_{d=1}^nd\bigg(\big(2\sum_{i=1}^{\frac nd}\varphi(i)\big)-1\bigg),則剩下就是求歐拉函數前綴和了。\\ 對於\sum_{i=1}^n\sum_{j=1}^n[gcd(i,j)=1]=2\sum_{i=1}^n\sum_{j=1}^i[gcd(i,j)=1]-\sum_{i=1}^n[gcd(i,i)=1]=\big(2\sum_{i=1}^n\varphi(i)\big)-1 \]


(51Nod 1238)定義最小公倍數之和的函數\(L(n)=\sum_{i=1}^n\sum_{j=1}^nlcm(i,j)\),給定正整數n,計算\(L(n)\)其中\(n\le10^{10}\)
\[ 方法1:L(n)=\sum_{i=1}^n\sum_{j=1}^nlcm(i,j)=\sum_{i=1}^n\sum_{j=1}^n\frac{i\cdot j}{gcd(i,j)}=\sum_{i=1}^n\sum_{j=1}^n\sum_{d=1}^n[gcd(i,j)=d]\frac{i\cdot j}{d}\\ =\sum_{d=1}^n\sum_{i=1}^{\frac nd}\sum_{j=1}^{\frac nd}[gcd(i,j)=1]i\cdot j\cdot d=\sum_{d=1}^n\sum_{i=1}^{\frac nd}\sum_{j=1}^{\frac nd}\sum_{k|gcd(i,j)}\mu(k)\cdot i\cdot j\cdot d=\sum_{d=1}^n\sum_{k=1}^{\frac nd}\sum_{i=1}^{\frac {n}{dk}}\sum_{j=1}^{\frac{n}{dk}}i\cdot j\cdot d\cdot\mu(k)\cdot k^2\\ =\sum_{d=1}^nd\sum_{k=1}^{\frac nd}\mu(k)\cdot k^2\sum_{i=1}^{\frac {n}{dk}}i\sum_{j=1}^{\frac{n}{dk}}j=\sum_{d=1}^nd\sum_{k=1}^{\frac nd}\mu(k)\cdot k^2\cdot\frac{(\lfloor\frac n{dk}\rfloor+1)^2\cdot \lfloor\frac n{dk}\rfloor^2}{4}\\ 而後就是求\mu(k)\cdot k^2的前綴和,可是這個方法時間複雜度太高好像爲O(n)。\\此題不可行。後面有一道題要用此方法。 \]


\[ 方法2:L(n)=\sum_{i=1}^n\sum_{j=1}^nlcm(i,j)=\sum_{i=1}^n\sum_{j=1}^n\frac{i\cdot j}{gcd(i,j)}=\sum_{i=1}^n\sum_{j=1}^n\sum_{d=1}^n[gcd(i,j)=d]\frac{i\cdot j}{d}\\ =\sum_{d=1}^nd\sum_{i=1}^{\frac nd}\sum_{j=1}^{\frac nd}[gcd(i,j)=1]i\cdot j=\sum_{d=1}^nd\sum_{i=1}^{\frac nd}i\sum_{j=1}^{\frac nd}[gcd(i,j)=1]j\\ 由於\sum_{i=1}^{n}i\sum_{j=1}^{n}[gcd(i,j)=1]\cdot j=2\sum_{i=1}^{n}i\sum_{j=1}^i[gcd(i,j)=1]\cdot j-\sum_{i=1}^n[gcd(i,i)=1]\cdot i\\ =\bigg(2\sum_{i=1}^ni\frac{i\cdot\varphi(i)+[i=1]}{2}\bigg)-1=\bigg(\sum_{i=1}^ni^2\cdot\varphi(i)+[i=1]\bigg)-1\\ 則得\sum_{d=1}^nd\bigg(\big(\sum_{i=1}^{\frac nd}i^2\cdot\varphi(i)+[i=1]\big)-1\bigg)=\sum_{d=1}^nd\sum_{i=1}^{\frac nd}i^2\cdot\varphi(i),而後就是求\phi(n)=\sum_{i=1}^ni^2\cdot \varphi(i)。\\ 令f(n)=n^2\cdot \varphi(n),則\sum_{d|n}f*(id)^2(n)=\sum_{d|n}d^2\cdot\varphi(d)\cdot(\frac nd)^2=n^2\sum_{d|n}\varphi(d)=n^3\\ 則\frac {n^2\cdot(n+1)^2}4=\sum_{i=1}^ni^3=\sum_{i=1}^n(f*id^2)(i)=\sum_{i=1}^n\sum_{d|i}d^2\cdot\varphi(d)\cdot(\frac id)^2=\sum_{i=1}^ni^2\sum_{d=1}^{\frac ni}d^2\cdot\varphi(d)\\=\sum_{i=1}^ni^2\cdot\phi(\frac ni),則\phi(n)=\sum_{i=1}^ni^2\cdot \phi(\frac ni)-\sum_{i=2}^ni^2\cdot \phi(\frac ni)=\frac{n^2\cdot(n+1)^2}{4}-\sum_{i=1}^ni^2\cdot\phi(\frac ni)\\ 最終得L(n)=\sum_{d=1}^nd\cdot\phi(\frac nd) \]


(Tsinsen A1231)定義最小公倍數之和的函數\(L(n,m)=\sum_{i=1}^n\sum_{j=1}^m lcm(i,j)\),給定正整數n,m,計算\(L(n,m)\)其中\(n,m\le10^{7}\)
\[ L(n)=\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)=\sum_{i=1}^n\sum_{j=1}^m\frac{i\cdot j}{gcd(i,j)}=\sum_{i=1}^n\sum_{j=1}^m\sum_{d=1}^n[gcd(i,j)=d]\frac{i\cdot j}{d}\\ =\sum_{d=1}^n\sum_{i=1}^{\frac nd}\sum_{j=1}^{\frac md}[gcd(i,j)=1]i\cdot j\cdot d=\sum_{d=1}^n\sum_{i=1}^{\frac nd}\sum_{j=1}^{\frac md}\sum_{k|gcd(i,j)}\mu(k)\cdot i\cdot j\cdot d=\sum_{d=1}^n\sum_{k=1}^{\frac nd}\sum_{i=1}^{\frac {n}{dk}}\sum_{j=1}^{\frac{m}{dk}}i\cdot j\cdot d\cdot\mu(k)\cdot k^2\\ =\sum_{d=1}^nd\sum_{k=1}^{\frac nd}\mu(k)\cdot k^2\sum_{i=1}^{\frac {n}{dk}}i\sum_{j=1}^{\frac{m}{dk}}j=\sum_{d=1}^nd\sum_{k=1}^{\frac nd}\mu(k)\cdot k^2\cdot\frac{\lfloor\frac n{dk}\rfloor\cdot(\lfloor\frac n{dk}\rfloor+1)\cdot \lfloor\frac m{dk}\rfloor\cdot(\lfloor\frac m{dk}\rfloor+1)}{4}\\ 到此時此題已經能夠過了。複雜度爲O(n).但其實還能夠優化。\\將最後面的一部分記爲sum(\frac n{dk},\frac m{dk}),\\ 則上式=\sum_{d=1}^nsum(\frac nd,\frac md)\sum_{k|d}\frac dk\cdot\mu(k)\cdot k^2,再令f(d)=\sum_{k|d}\frac dk\cdot\mu(k)\cdot k^2,\\由於積性函數的約數和也是積性函數,因此f數組能夠預處理出來。 \\對於一個素數p,它的新 f 值顯然是 p - p^2 的\\ 若是 p 是多個素數的一次項的積\\ 顯然 f 是積性的 f( p ) = f( p1 ) * f( p2 ) * f( p3 )……\\ 若是 p 的惟一分解存在質因子的\\指數大於1,它新增的每個因子的 μ 值都是0,沒有意義,\\只有統計時D變成了原來的 j 倍,因此 此時f( p ) = f( i ) * j\\ 前綴和在以後加一下就能夠了\\ \]


不知道爲何顯然的看下面(相似)

積性函數的線性篩原理:

\[ \because \sum_{d|n}\varphi(d)=n,則由莫比烏斯反演得\varphi(n)=\sum_{d|n}\mu(d)\cdot\frac{n}{d}=\sum_{d|n}\mu(\frac{n}{d})\cdot d\\ 由莫比烏斯函數的意義: \mu(n)=\left\{\begin{array}{ll} 1&若n=1\\ (-1)^k&若n無平方數因數,且n=p_1p_2\dots p_k\\ 0&若n有大於1的平方因數 \end{array}\right.\\可知,當n爲素數時,\varphi(n)=\mu(n)\cdot 1+\mu(1)\cdot n=n-1 \\當n=p_1p_2\dots p_k,即無平方數因數,\varphi(n)=\varphi(p_1)\cdot\varphi(p_2)\cdot \dots\cdot\varphi(p_k)\\ 當n中有平方數因數時,平方數因數對\varphi(n)沒有貢獻即:\\ 假設n=i\cdot y,y是x的一個最小質因數則:\varphi(i)=\sum_{d|i}\mu(d)\frac {i}{d}\\ \varphi(n)=\varphi(i\cdot y)=\sum_{d|(i\cdot y)}\mu(d)\frac {i\cdot y}{d}=y\cdot \sum_{d|(i\cdot y)}\mu(d)\frac {i}{d}=y\cdot \varphi(i)\\ \\綜上\varphi(n)= \left\{\begin{matrix} n-1&n\in primes\\ f(i)\cdot y&y^2|n\\ f(i)\cdot f(y)&y^2 \not \mid n \end{matrix}\right.其中,y爲n的最小質因數,而且n=i\cdot y \]


2019-ICPC-南京賽區-網絡賽E:\(f_n(k)=\sum_{l_1=1}^n\sum_{l_2=1}^n\dots\sum_{l_k=1}^n gcd(l_1,l_2,\dots,l_k)\)。求\(\sum_{i=2}^kf_n(i)\ mod \ (10^9+7)\)\(n\le 10^9,k\le 10^{10^5}\)

對於\(f_n(k)\)有:
\[ \sum_{l_1=1}^n\sum_{l_2=1}^n\dots\sum_{l_k=1}^ngcd(l_1,l_2,\dots,l_k)=\sum_{d=1}^n\sum_{l_1=1}^{\frac{n}{d}}\sum_{l_2=1}^{\frac{n}{d}}\dots\sum_{l_k=1}^{\frac{n}{d}}[gcd(l_1,l_2,\dots,l_k)=1]\cdot d^2 \\=\sum_{d=1}^nd^2\sum_{t=1}^{n}\mu(t)\sum_{l_1=1}^{\frac{n}{dt}}\sum_{l_2=1}^{\frac{n}{dt}}\dots\sum_{l_k=1}^{\frac{n}{dt}}=\sum_{d=1}^nd^2\sum_{t=1}^n\mu(t)\lfloor\frac{n}{dt}\rfloor^k \]
\(T=dt\)得:
\[ f_n(k)=\sum_{T=1}^{n}\sum_{t|T}\mu(t)\cdot\frac{T^2}{t^2}\cdot \lfloor\frac{n}{T}\rfloor^k \]
\(\sum_{i=2}^kf_n(i)\)爲:
\[ \sum_{i=2}^kf_n(i)=\sum_{i=2}^k\sum_{T=1}^n\sum_{t|T}\mu(t)\cdot \frac{T^2}{t^2}\cdot \lfloor\frac{n}{T}\rfloor^k=\sum_{T=1}^n\sum_{t|T}\mu(t)\frac{T^2}{t^2}\sum_{i=2}^k\lfloor\frac{n}{T}\rfloor^k \\=\sum_{T=1}^n\sum_{t|T}\mu(t)\frac{T^2}{t^2}\Big(\frac{\lfloor\frac{n}{T}\rfloor^{k+1}-1}{\lfloor\frac{n}{T}\rfloor-1}-\lfloor\frac{n}{T}\rfloor-1\Big) \]
​ 由於\(k\le 10^{10^5}\),因此用歐拉定理降冪取模便可。注意特判\(\lfloor \frac{n}{T}\rfloor=1\)的狀況。

​ 其中令\(g(T)=\sum_{t|T}\mu(t)\cdot \frac{T^2}{t^2},\Phi(n)=\sum_{T=1}^ng(T)\)。對於\(T\)小的部分能夠經過線性篩求得:

​ 1. 當\(T\)爲素數時,\(g(T)=T^2-1\)
​ 2. 若\(T\)中無平方質因子時\(T=p_1\cdot p_2\dots p_k\),由於\(g(T)\)爲積形函數,則有\(g(T)=g(p_1)\cdot g(p_2)\dots g(p_k)\)

​ 3. 若\(T\)中有平方質因子時,有\(g(T\cdot p)=g(T)\cdot p^2\)

​ 對於\(T\)大的部分,咱們發現\(g(T)=\mu*id^2(T)\),則\(g*I(T)=\mu*I*id^2(T)=e*id^2(T)=id^2(T)=T^2\)。則有:

\[ \sum_{T=1}^nT^2=\sum_{T=1}^n\sum_{d|T}g(d)=\sum_{T=1}^n\sum_{d|T}\sum_{t|d}\mu(t)\cdot \frac{d^2}{t^2}=\sum_{T=1}^n\sum_{d=1}^{\frac{n}{T}}\sum_{t|d}\mu(t)\cdot\frac{d^2}{t^2} \\=\sum_{T=1}^n\Phi(\frac{n}{T}),則\Phi(n)=\frac{n\cdot (n+1)\cdot (2\cdot n+1)}{6}-\sum_{T=2}^n\Phi(\frac{n}{T}) \]


放個51Nod1238代碼當模板用:

/*
 * @Author: Simon 
 * @Date: 2019-05-03 12:35:17 
 * @Last Modified by: Simon
 * @Last Modified time: 2019-05-03 17:29:21
 */
#include<bits/stdc++.h>
using namespace std;
typedef int Int;
#define int long long
#define INF 0x3f3f3f3f
#define maxn 5000005
#define Mod 3000005
const int mod=1e9+7;
int inv2,inv4,inv6;
struct HashMap{
    int head[Mod],key[Mod],value[Mod],nxt[Mod],tol=0;
    void clear(){
        tol=0;memset(head,-1,sizeof(head));
    }
    HashMap(){
        clear();
    }
    void insert(int k,int v){
        int idx=k%Mod;
        for(int i=head[idx];~i;i=nxt[i]){
            if(key[i]==k){
                value[i]=min(value[i],v);
                return ;
            }
        }
        key[tol]=k;value[tol]=v;nxt[tol]=head[idx];head[idx]=tol++;
    }
    int operator [](int k){
        int idx=k%Mod;
        for(int i=head[idx];~i;i=nxt[i]){
            if(key[i]==k) return value[i];
        }
        return -1;
    }
}mp;
Int prime[maxn],Phi[maxn],cnt=0,sum[maxn];
bool vis[maxn]={1,1};
void Euler(){
    Phi[1]=1;
    for(int i=2;i<maxn;i++){
        if(!vis[i]){
            prime[++cnt]=i;
            Phi[i]=i-1;
        }
        for(int j=1;j<=cnt&&i*prime[j]<maxn;j++){
            vis[i*prime[j]]=1;
            if(i%prime[j]==0){
                Phi[i*prime[j]]=Phi[i]*prime[j];
                break;
            }
            Phi[i*prime[j]]=Phi[i]*(prime[j]-1);
        }
    }
    for(int i=1;i<maxn;i++) sum[i]=(sum[i-1]+i%mod*i%mod*Phi[i])%mod;
}
int sum_1(int n){
    n%=mod;
    return n%mod*(n+1)%mod*inv2%mod;
}
int sum_2(int n){
    n%=mod;
    return n%mod*(n+1)%mod*(2*n+1)%mod*inv6%mod;
}
int sum_3(int n){
    n%=mod;
    return n%mod*n%mod*(n+1)%mod*(n+1)%mod*inv4%mod;
}
int dfs(int n){
    if(n<maxn) return sum[n];
    if(mp[n]!=-1) return mp[n];
    int sum=0;
    for(int i=2,j;i<=n;i=j+1){
        j=n/(n/i);
        (sum+=(sum_2(j)-sum_2(i-1)+mod)%mod*dfs(n/i)%mod)%=mod; 
    }
    sum=(sum_3(n)-sum+mod)%mod;
    mp.insert(n,sum);
    return sum;
}
int solve(int n){
    int sum=0;
    for(int i=1,j;i<=n;i=j+1){
        j=n/(n/i);
        (sum+=(sum_1(j)-sum_1(i-1)+mod)%mod*dfs(n/i)%mod)%=mod;
    }
    return sum;
}
int fpow(int a,int b){
    a%=mod;int ans=1;
    while(b){
        if(b&1) (ans*=a)%=mod;
        (a*=a)%=mod;
        b>>=1;
    }
    return ans;
}
Int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);Euler();
    inv2=fpow(2,mod-2);inv4=fpow(4,mod-2);inv6=fpow(6,mod-2);
    int n;scanf("%lld",&n);
    printf("%lld\n",solve(n));
    cin.get(),cin.get();
    return 0;
}

莫比烏斯反演擴展

結尾補一個不經常使用的莫比烏斯反演非卷積形式的公式,對於數論函數\(f,g\)和徹底積性函數\(t\)\(t(1)=1\):

\[ f(n)=\sum_{i=1}^nt(i)\cdot g\Big(\Big \lfloor \frac{n}{i}\Big \rfloor \Big)\\ \Leftrightarrow g(n)=\sum_{i=1}^n\mu(i)\cdot t(i)\cdot f\Big(\Big \lfloor \frac{n}{i}\Big \rfloor \Big)\\ \]

補充:特殊形式下的積性函數的線性篩原理

\[ 如何利用線性篩來O(n)求出函數f(x)=\sum_{p\in primes,p|x}\mu(\frac {x}{p})的前綴和\\令x的最小質因子爲y,即x=i\cdot y\\ 一、x\in primes ,p只能等於x,則f(x)=\mu(\frac {x}{x})=\mu(1)=1\\ 二、i\%y=0,即x有多個最小質因子,f(x)=f(i\cdot y)=\sum_{p\in primes,p|(i\cdot y)}\mu(\frac {i\cdot y}{p}) \\當i沒有多個相同的質因子,當且僅當p=y時,\mu(\frac {i\cdot y}{p})不爲0,故f(x)=u(i)。 \\當i也有多個相同的質因子,那麼對於任意的p,都有\mu(\frac {i\cdot y}{p})=0,故f(x)=0 \\因此f(x)=\mu(i)+0=\mu(i) \\三、i\%y\neq 0,即x只有一個最小質因子:有f(i)=\sum_{p\in primes,p|i}\mu(\frac {i}{p}) \\f(x)=f(i\cdot y)=\sum_{p\in primes,p|(i\cdot y)}\mu(\frac {i\cdot y}{p})\\= \left\{\begin{matrix} \sum_{p\in primes,p|(i\cdot y)}\mu(\frac {i}{p})\cdot \mu(y)=\sum_{p\in primes,p|(i\cdot y)}-\mu(\frac {i}{p})=-f(i)&p\neq y\\ \sum_{p\in primes,p|(i\cdot y)}\mu(\frac {i\cdot y}{y})=\sum_{p\in primes,p|(i\cdot y)}\mu({i})=\mu(i)&p=y \end{matrix}\right.\\ 因此f(x)=-f(i)+\mu(i)\\ 綜上f(x)=\left\{\begin{matrix} 1&x \in primes\\ \mu(i)&y^2|x,即x有平方數因子\\ -f(i)+\mu(i)&y^2\not \mid x,即x無平方數因子 \end{matrix}\right.\\其中,y爲n的最小質因數,而且n=i\cdot y \]

相關文章
相關標籤/搜索