1. 程式人生 > >淺談積性函式求字首和

淺談積性函式求字首和

前置技能

積性函式的定義

  1. 若f(n)f(n)的定義域為正整數域,值域為複數,即f:Z+→Cf:Z+→C,則稱f(n)f(n)為數論函式
  2. 若f(n)f(n)為數論函式,且f(1)=1f(1)=1,對於互質的正整數p,qp,q有f(p⋅q)=f(p)⋅f(q)f(p⋅q)=f(p)⋅f(q),則稱其為積性函式
  3. 若f(n)f(n)為積性函式,且對於任意正整數p,qp,q都有f(p⋅q)=f(p)⋅f(q)f(p⋅q)=f(p)⋅f(q),則稱其為完全積性函式

積性函式的性質與例子

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

ACM賽題是需要這種技巧在低於線性時間的複雜度下解決一類積性函式的字首和問題。

首先看一個簡單的例子,求前nn個正整數的約數之和,即\sum_{i=1}^{n}\sigma \left ( i \right ),其中n\leq 10^{12}。 
顯然不能直接做了,但是我們可以推導一番:

如果能通過狄利克雷卷積構造一個更好計算字首和的函式,且用於卷積的另一個函式也易計算,則可以簡化計算過程。例如上題就是利用了\varphi \ast I= id的性質,但一定注意,不是所有的這一類題都只用配個恆等函式II就可以輕鬆完事的,有時需要更細緻的觀察。

但是注意到這種方法的常數與複雜度都可能較高,有時候可能再進行一些推導可以得到一個不使用正文方法的做法,例如ZOJ 3881 - From the ABC conjecture,本文的方法與網上一個解法類似,可以用於求解此題,但是可以這樣推導之後

得到更簡單的一個做法。

需要使用此種方法的題目一般資料規模較大,例如,但是並不是都要使用此類方法,有時候可能存在其他O(\sqrt{n})的做法,例如51Nod 1222 - 最小公倍數計數,會利用正文複雜度分析的方法即可,再例如ZOJ 5340 - The Sum of Unitary Totient

推薦題目