数论:每次都是预习
让我们从筛法开始吧(
\(1.\) 最简单的埃氏筛
int zhi[maxn],tot;
bool vis[maxn];
inline void get_prime() { // Eratosthenes
vis[0]=vis[1]=true;
for(int i=2;i<maxn;++i)
if(!vis[i]) {
zhi[++tot]=i;
for(int j=i;j<maxn;j+=i)
vis[j]=true;
}
return;
}
时间复杂度 \(\mathcal O(nloglogn)\)。
\(2.\) \(\mathtt{Euler}\) 筛(线性筛)
int zhi[maxn],tot;
bool vis[maxn];
inline void get_prime() { // Euler
vis[0]=vis[1]=true;
for(int i=2;i<maxn;++i) {
if(!vis[i]) zhi[++tot]=i;
for(int j=1;j<=tot && i*zhi[j]<maxn && i%j;++j)
vis[i*j]=true;
}
return;
}
顾名思义,复杂度 \(\mathcal O(n)\)。
- 欧拉函数
\(\varphi(n)\) 表示不超过 \(n\) 且与 \(n\) 互质的正整数个数。
计算方法:
设 \(n\) 的标准分解 \(n=p_1^{a_1}\times p_2^{a_2}\dots p_s^{a_s}\)
\(\varphi(n)=n-\dfrac{1}{p_1}-\dfrac{1}{p_2}-\dots-\dfrac{1}{p_s}+\dfrac{1}{p_1p_2}+\dots\dots+(-1)^s \times \dfrac{1}{p_1p_2\ldots p_s}\)
推出:
重要性质:
- \(\varphi(ab)=\varphi(a)\varphi(b)\) (\(a\),\(b\) 互质)
- \(n=\sum \limits_{d|n}\varphi(d)\) (证明)
计算方法:
- 直接通过定义式算,复杂度 \(\mathcal O(\sqrt n)\)
inline int phi(int x) {
int ans=x;
for(int i=2;i*i<=x;++i)
if(!(x%i)) {
ans=ans/i*(i-1);
while(!(x%i)) x/=i;
}
if(x!=1) ans=ans/x*(x-1);
return ans;
}
- 线性筛还可以筛 \(\mathtt{Euler}\) 函数(一家人
bool vis[maxn];
int zhi[maxn],tot,phi[maxn];
inline void get_phi() {
phi[1]=1;
for(int i=2;i<=n;++i) {
if(!vis[i]) {
phi[i]=i-1;
zhi[++tot]=i;
}
for(int j=1;j<=tot;++j) {
if(i*zhi[j]>n) break;
vis[i*zhi[j]]=true;
if(i%zhi[j]) phi[i*zhi[j]]=phi[i]*(zhi[j]-1);
else {phi[i*zhi[j]]=phi[i]*zhi[j]; break;}
}
}
return;
}
\(3.\) \(\mathtt{Dirichlet}\) 卷积
前置芝士:几个有用的函数
-
欧拉函数 \(\varphi(n)\) 见上
-
单位函数 \(\epsilon(n)=[n=1]= \begin{cases} 1&n=1\\ 0&n\ne1 \end{cases}\)
-
莫比乌斯函数 \(\mu(n)= \begin{cases} 1&n=1\\ 0&\text{n 有平方因子}\\ (-1)^s&\text{s 是 n 的标准分解中质因子的种类数} \end{cases}\)
狄利克雷卷积 \((*)\):
即:
单位函数是狄利克雷卷积的单位元,具体体现为 \(f*\epsilon=f\)
狄利克雷卷积满足交换律结合律:\(f*g=g*f\),\((f*g)*h=f*(g*h)\)
例:
P2303 Longge 的问题
题意:
求:
解:
\(4.\) \(\mathtt{m\ddot obius}\) 反演
- \(\mathtt{m\ddot obius}\) 函数的性质: \(\mu*1=\epsilon\)
- \(\mathtt{m\ddot obius}\) 变换:
定义:
则称 \(g\) 是 \(f\) 的 \(\mathtt{m\ddot obius}\) 变换,\(f\) 是 \(g\) 的 \(\mathtt{m\ddot obius}\) 逆变换
可以从 \(f\) 求 \(g\),那么如何从 \(g\) 求 \(f\) 呢?
对!就是 \(\mathtt{m\ddot obius}\) 反演!
证明:
\(g=f*1\Leftrightarrow f=f*\epsilon=f*1*\mu=g*\mu\)
用到以下 \(2\) 个性质:
- \(f*\epsilon=f\)
- \(1*\mu=\epsilon\)

浙公网安备 33010602011771号