數論入門1
一個菜雞對數論的一點點理解...
莫比烏斯函數
定義函數\(\mu(n)\)為:
- 當n有平方因子時,\(\mu(n)=0\)。
- 當n沒有平方因子時,\(\mu(n)=(-1)^{\omega(n)}\),\(\omega(n)\)表示n不同質因子的個數。
性質1:
\(\sum_{d|n}\mu(d)=[n=1]\)
證明:我們把n分解質因數,則原式\(=(-1+1)^{\omega(n)}=0\)。
因為對於不同的質因子,只有選和不選兩種方案,這是一個組合數相加的形式,偶數加奇數減,根據二項式定理得到原式\(=(-1+1)^{\omega(n)}=0\)。
但是\(n=1\)時,沒有質因子,原式\(=\)$ 0\choose0$$=1$。
性質2:
\(\mu(n)\)是積性函數。
證明顯然。
歐拉函數
定義函數\(\varphi(n)\)為:小於等於n的正整數中和n互質的數的個數。
那么根據歐拉函數的定義,再根據上面的性質,我們可以在\(O(\sqrt n)\)的時間內通過分解質因數得到\(\varphi(n)\)。
具體方法,對於每個不同的質因子,相當於把它在1-n中的倍數去掉,那么就有\(n*(1-\frac{1}{pi})\)個,連乘起來即可。
性質1:
對於質數p,\(\varphi(p)=p-1\)。
性質2:
對於質數p,\(\varphi(p^k)=(p-1)*p^{k-1}\)
證明:首先,對於\(p|n,q< p,q\perp p\),則\(q+pk\perp n\)。
那么這就很顯然了。
性質3:
\(\varphi\)是個積性函數。
根據定義式就能看出來。
性質4:
歐拉定理:對於互質的a,m有:\(a^{\varphi(m)} \equiv 1 \pmod {m}\)。
不會證明,自行百度。
性質5:
小於n且與n互質的正整數之和為\(\varphi(n)*n/2\)。
證明:首先,若\(p|n\),則\(n-p|n\)。
那么對於所有p,把它和n-p合到一起算,就是\(\varphi(n)*n\),最后除以2就行了,因為每對數算了兩次。
對於n=1不適用。
性質6:
\(\sum\limits_{d|n} \varphi(d) = n\)
證明:
\(n=\sum_{i|n} \sum_{j=1}^n[gcd(j,n)=i]\)
\(=\sum_{i|n}\sum_{j=1}^{n/i}[gcd(j,n)=1]\)
\(=\sum_{i|n}\varphi(n/i)\)
\(=\sum_{i|n}\varphi(i)\)
得證。
其中第一句就是,把1-n中的數按照gcd進行分類並且計數。
狄利克雷卷積
定義卷積\((f*g)(n)=\sum_{d|n}f(d)g(\frac{n}{d})\)
性質1:
兩個積性函數的狄利克雷卷積還是積性函數。
證明:感性理解一下,兩個互質的下標乘起來,相當於兩個和式乘起來,因為是互質的相當於枚舉到了乘積的所有約數,因為和式里面都是積性函數所以乘起來也是積性函數。
性質2:
三大運算規律:結合律,交換律,分配律。
感性理解一下就好啦。
然后給一點常用函數吧,杜教篩和莫比烏斯反演的時候有點用的。
- \(\mu(n)\),不解釋了。
- \(\varphi(n)\),不解釋了。
- \(\sigma(n)\),表示n的約數和。
- \(d(n)\),表示n的約數個數。
- \(e(n)\),等於\([n=1]\)。
- \(I(n)\),等於1。
- \(id(n)\),等於n。
其中后三個是完全積性函數。
然后給點公式吧。
\(\mu*I=e\)
\(\varphi*I=id\)
\(id*\mu=\varphi\)
\(I*I=d\)
\(I*id=\sigma\)
\(\varphi(n)=\mu*id \quad->\quad\frac{\varphi(n)}{n}=\sum_{d|n}\frac{\mu(d)}{d}\)
還有一些就不列舉啦(其實是不會)
線性篩
一種可以在\(O(n)\)時間內求一個積性函數在1-n的值的算法,順便還可以求出1-n中的素數表。
因為保證了每個數只會被它的最小質因子篩到。
代碼實現:
void getprime()
{
for(int i=2;i<=n;i++)
{
if(!vis[i]) pri[++tot]=i,mu[i]=-1,phi[i]=i-1;
for(int j=1;j<=tot&&i*pri[j]<=n;j++)
{
vis[i*pri[j]]=1;
if(i%pri[j]==0)
{
mu[i*pri[j]]=0;
phi[i*pri[j]]=phi[i]*pri[j];
break;
}
mu[i*pri[j]]=-mu[i];
phi[i*pri[j]]=phi[i]*(pri[j]-1);
}
}
}
就解釋一句吧。
if(i%pri[j]==0){break;}
這一句是什么呢。質數表是遞增的,如果i是pri[j]的倍數了,那么后面的i*pri[k]的最小質因子絕對不可能是pri[k],而在之后一定會被篩到,所以就要break掉了。
所以我們可以看出,這個i只是起到了枚舉質數倍數幾倍的作用,這就很清晰了。
然后一個積性函數f能夠線性篩的話,需要滿足的性質有:
1.對於質數p,\(f(p)\)能夠快速計算。
2.對於n中出現過的一個質因子p,\(f(n*p)\)能夠快速計算。
然后如果需要有輔助函數的話,輔助函數也一定要是積性函數,一般都是維護最小質因子的輔助函數,比如篩約數個數,那么我們維護最小質因子的出現次數就可以很容易計算啦。
莫比烏斯反演
已知\(F(n)=\sum_{d|n}f(d)\)
那么\(f(n)=\sum_{d|n}\mu(d)F(\frac{n}{d})\)。
證明:
\(F=f*I\)
\(F*\mu=f*I*\mu\)
\(F*\mu=f*e\)
\(F*\mu=f(n)\)
得證。
同理,已知\(F(n)=\sum_{n|d}f(d)\)
那么\(f(n)=\sum_{n|d}\mu(\frac{d}{n})\cdot F(d)\)
不過做題的時候用的最多的還是兩種函數的性質,直接反演用的比較少啦。
整除分塊
一種可以在\(O(\sqrt n)\)時間內求上界與除法下取整有關的式子的算法。
問題:求\(\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor,n\leq1e9\)
我們先發現一點關於\(\lfloor\frac{n}{i}\rfloor\)的性質。
- 對於\(\lfloor\frac{n}{i}\rfloor\),只有\(2\sqrt n\)種取值。
- 設\(\lfloor\frac{n}{j}\rfloor=\lfloor\frac{n}{i}\rfloor\),則\(j\)的最大值為\(\large \left \lfloor \frac N{\left \lfloor \frac Ni \right \rfloor } \right \rfloor\)
證明:
第一個,對於小於\(\sqrt n\)的\(i\),顯然最多產生兩個貢獻\(\lfloor\frac{n}{i}\rfloor\)和\(i\),所以是\(2\sqrt n\)。
第二個:
設\(\large{ \lfloor \frac Ni \rfloor}=k\),於是可以寫成\(ki+p=N,1\le p<i\)的形式,若\(\large{\lfloor \frac N{i+d} \rfloor}=k\),於是有 \(k(i+d)+p'=N\),可以得到\(p'=p-kd\),則\(d\)能取的最大值為\(\large \lfloor \frac pk \rfloor\),於是 :
[我太菜了不會證,搬別人的]
貼段代碼,解決上面的問題。
for(int l=1,r;l<=n;l=r+1)
{
r=n/(n/l);
ans+=(r-l+1)*(n/l);
}
杜教篩
杜教篩是一種可以在低於線性時間內計算一類積性函數前綴和的算法。
設\(S(n)=\sum_{i=1}^{n}f(i)\)
然后我們找一個積性函數\(g(i)\)
\((g*f)(i)= \sum_{d|i}g(d)f(\frac{i}{d})\)
\(\sum_{i=1}^{n}(g*f)(i)= \sum_{i=1}^n\sum_{d|i}g(d)f(\frac{i}{d})\)
和式變換一下
\(\sum_{d=1}^{n}g(d)\sum_{d|i}f(\frac{i}{d})\)
\(\sum_{d=1}^{n}g(d)\sum_{i=1}^{n/d}f(i)\)
\(\sum_{d=1}^ng(d)S(\frac{n}{d})\)
我們現在要求\(S(n)\)
然后發現,當\(d=1\)時,有個\(g(1)S(n)\)
那么我們提出來
\(g(1)S(n)=\sum_{i=1}^ng(i)S(\frac{n}{i})-\sum_{i=2}^ng(i)S(\frac{n}{i})\)
\(g(1)S(n)=\sum_{i=1}^n(g*f)(i)-\sum_{i=2}^ng(i)S(\frac{n}{i})\)
那么只要兩個函數卷積的前綴和很好算,g的前綴和很好算,就可以直接記憶化了。
復雜度不會證,是\(O(n^\frac{3}{4})\)的,如果預處理前\(n^\frac{2}{3}\)項的話,復雜度就變成了\(O(n^\frac{2}{3})\)。
那么如果要篩\(\mu\)的話,我們知道\(\mu\)和\(I\)的卷積十分好算,然后\(I\)的前綴和也很好算,可以試試:
\(S(n)=1-\sum_{i=2}^{n}S(\frac{n}{i})\)
對這就完了。
\(\varphi\)也挺簡單的,和\(I\)卷積。
\(S(n)=\sum_{i=1}^{n}i-\sum_{i=2}^{n}S(\frac{n}{i})\)
對於不同的積性函數,配上一個好的g函數,能方便很多。
常見套路就是比如說有個\(i*f(i)\),那么我們拿id求個卷積,是不是i就被消掉了呢?
如果是\(i^2\)也可以考慮用\(g(i)=i^2\)來做卷積。
以此類推啦。
題目
挖個坑,待填