数论:每次都是预习

让我们从筛法开始吧(

\(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(n)=n\times \prod \limits_{i=1}^{s} (1-\dfrac{1}{p_i}) \]

重要性质:

  1. \(\varphi(ab)=\varphi(a)\varphi(b)\)\(a\)\(b\) 互质)
  2. \(n=\sum \limits_{d|n}\varphi(d)\)证明

计算方法:

  1. 直接通过定义式算,复杂度 \(\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;
}
  1. 线性筛还可以筛 \(\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}\) 卷积

前置芝士:几个有用的函数

  1. 欧拉函数 \(\varphi(n)\) 见上

  2. 单位函数 \(\epsilon(n)=[n=1]= \begin{cases} 1&n=1\\ 0&n\ne1 \end{cases}\)

  3. 莫比乌斯函数 \(\mu(n)= \begin{cases} 1&n=1\\ 0&\text{n 有平方因子}\\ (-1)^s&\text{s 是 n 的标准分解中质因子的种类数} \end{cases}\)

狄利克雷卷积 \((*)\)

\[f=g*t \]

即:

\[f(n)=\sum \limits_{d|n}g(d)t(\frac{n}{d}) \Leftrightarrow \sum \limits_{ij=n}g(i)t(j)\]

单位函数是狄利克雷卷积的单位元,具体体现为 \(f*\epsilon=f\)

狄利克雷卷积满足交换律结合律:\(f*g=g*f\)\((f*g)*h=f*(g*h)\)

例:

P2303 Longge 的问题
题意:
求:

\[\sum\limits_{i=1}^{n}gcd(i,n) \]

解:

\[\begin{aligned}\sum\limits_{i=1}^{n}gcd(i,n)=&\sum\limits_{d|n}d\sum\limits_{i=1}^{n}\left[gcd(i,n)=d\right] \\ =&\sum\limits_{d|n}d\sum\limits_{i=1}^{\frac{n}{d}}\left[gcd(i,\frac{n}{d})=1\right] \\ =&\sum\limits_{d|n}d\varphi(\frac{n}{d}) \end{aligned} \]

\(4.\) \(\mathtt{m\ddot obius}\) 反演

  1. \(\mathtt{m\ddot obius}\) 函数的性质: \(\mu*1=\epsilon\)
  2. \(\mathtt{m\ddot obius}\) 变换:

定义:

\[g(n)=\sum\limits_{d|n}f(d) \]

则称 \(g\)\(f\)\(\mathtt{m\ddot obius}\) 变换,\(f\)\(g\)\(\mathtt{m\ddot obius}\) 逆变换

可以从 \(f\)\(g\),那么如何从 \(g\)\(f\) 呢?

对!就是 \(\mathtt{m\ddot obius}\) 反演!

\[f(n)=\sum\limits_{d|n}g(d)\mu(\frac{n}{d}) \]

证明:

\(g=f*1\Leftrightarrow f=f*\epsilon=f*1*\mu=g*\mu\)

用到以下 \(2\) 个性质:

  1. \(f*\epsilon=f\)
  2. \(1*\mu=\epsilon\)
posted @ 2021-12-21 12:03  Electro_Master  阅读(57)  评论(0)    收藏  举报