积性函数

积性函数

(更新中)

定义

​ 积性函数:对于函数f,对于任何互质的p,q都存在f(p q) = f(p) f(q), 那么 f 是积性函数。

​ 完全积性函数:对于函数f,对于任何的p,q都存在f(p q) = f(p) f(q), 那么 f 是完全积性函数。

​ 积性函数一定满足f(1) = 1。

​ 证明:f(x) != 0, f(x) = f(1 × x) = f(1) × f(x), 所以f(1) = 1。

常见积性函数

\(\varphi(n)\) - 欧拉函数 \(\varphi(n) = \sum_{i=1}^{n}[i \nmid n]\)

\(\mu(n)\) - 莫比乌斯函数

\(\mu(\mathrm{n})=\left\{\begin{array}{ll} 1 & \mathrm{n}=1 \\ 0 & \exists \mathrm{p}, \mathrm{~p}^{2} \mid \mathrm{n} \\ (-1)^{k} & \text { k 是质因子个数 } \end{array}\right. \)

\(\sigma_{k}(n)\) - 除数函数 $\sigma_{k}(n) = \sum_{d|n}d^{k} $

\(k = 0\) 的时候 \(\sigma_{0}(n)\) 是$d(n), $求因子个数 \(d(n) = \sum_{i|n}1\)

\(k = 1\) 的时候 \(\sigma_{1}(n)\) 是$\sigma(n), $求因子和 \(d(n) = \sum_{d|n}d\)

$1(n) - $不变函数, \(1(n) = 1\) (完全积性)

$id(n) - $单位函数, \(id(n) = n\) (完全积性)

$idk(n) - $幂函数, \(idx(n) = n^{k}\) (完全积性)

\(\varepsilon (n)\) - 定义:\(\varepsilon (n) = [n=1]\)(完全积性)
\(\varepsilon(n)是\)对于狄利克雷卷积的单位元

狄利克雷卷积

定义

若函数f,g是积性函数,f和g的狄利克雷卷积是:\(f * g(n)=\sum_{d|n}f(d)g(\frac{n}{d})\)
用 * 表示狄利克雷卷积

性质:

交换律

\(\qquad f * g(n)=\sum_{d|n}f(d)g(\frac{d}{n}) = \sum_{d|n}g(d)f(\frac{d}{n}) = g*f(n)\)

结合律

\(\qquad f * g * h(n) = \sum_{d|n}f(d)\sum_{t|\frac{n}{d}}g(t)h(\frac{n}{dt})=f*(g*h)(n)\)

分配律

\(\qquad f*(g+h)=f*g+f*h\)

单位元

\(\qquad \varepsilon - f * \varepsilon=f\)

逆元

\(\qquad\) 对于一个数论函数f, 满足 \(f(x)\not=0,\) 若存在数论函数g使得 \(f * g = \varepsilon,\) 就称g是f的逆元,逆元是唯一的

其他性质:

$\qquad $两个积性函数的狄利克雷卷积也是积性函数,积性函数的逆元也是积性函数

常见的狄利克雷卷积

\(1 * 1(n) = \sum_{d|n}1 = d(n)\)

\(id * 1(n) = \sum_{d|n}d = \sigma(n)\)

\(\mu * 1(n) = \sum_{d|n} \mu(d) (\frac{n}{d}) = [n=1]= \varepsilon(n)\)

证明 \(\mu * 1(n) = \sum_{d|n} \mu(d) (\frac{n}{d}) = [n=1]= \varepsilon(n)\)

\( \qquad n\)可以分解为,\(n=p_{1}^{a_1}p_{2}^{a_2} ... p_{k}^{a_k} \quad \)代入式子可以得到:\(\\ \)

\[\begin{align*} \mu*1(n) &= {\sum_{d|n}} \mu(d) 1 (\frac{n}{d}) \\ &=\sum_{c_{1}=0}^{a_{1}}\sum_{c_{2}=0}^{a_{2}}...\sum_{c_{k}=0}^{a_{k}} \mu(p_{1}^{c_1}p_{2}^{c_2} ... p_{k}^{c_k}) \end{align*} \]

$\qquad $由 \(\mu\) 函数得到 \(c_{i}>1\) 时,\(\mu\) 的值是0,所以式子变成:

\[\begin{align*} \mu*1(n) &= {\sum_{d|n}} \mu(d) 1 (\frac{n}{d}) \\ &=\sum_{c_{1}=0}^{1}\sum_{c_{2}=0}^{1}...\sum_{c_{k}=0}^{1} \mu(p_{1}^{c_1}p_{2}^{c_2} ... p_{k}^{c_k}) \\ &= \sum_{i=0}^{k}(-1)^{i} \begin{pmatrix} k\\i \end{pmatrix} \\ &=[k=0]=[n=1]=\varepsilon(n) \end{align*} \]

莫比乌斯反演

公式一

如果\(F(n) = \sum_{d|n} f(d),\)那么\(f(n)=\sum_{d|n} \mu(d)F(\frac{n}{d})\)
证明公式一
$F[n] = \sum_{d|n} f(d) $代入 后面的式子得到

\[\begin{align*} f(n) &= \sum_{d|n} \mu(d) F(\frac{n}{d}) \\ &= \sum_{d|n} \mu(d) \sum_{k|\frac{n}{d}} f(k) \\ &= \sum_{k|n} f(k) \sum_{d|\frac{n}{k}} \mu(d) \\ &= \sum_{k|n} f(k) [n=k] = f(n) \end{align*} \]

先把\(F(n)=\sum_{d|n}f(d)\)代入, 因为 \(k | \frac{n}{d}\), 所以 \(d | \frac{n}{k}\), 交换式子顺序, 发现有格式是\(\sum_{d|n} \mu(d)\)的部分,等价于\([n=1]\),原式为[n=k],所以只有n=k的时候成立,\(f(k)=f(n)\)

用狄利克雷卷积证明就是\(F=f*1,\)证明\(f = \mu * F \\ F * \mu = f * 1 * \mu = f * \varepsilon = f \)

常用的结论及其推导

结论一: \([gcd(i,j)=1] = \sum_{d|i, d|j} \mu(d)\)
结论二: \(\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)=k]=\sum_{d=1}^{\left \lfloor \frac{n}{k} \right \rfloor} \mu(d)\left \lfloor \frac{n}{dk} \right \rfloor \left \lfloor \frac{m}{dk} \right \rfloor\)
证明:

假设$n<=m, $先把 \(k\) 提出来,我们要构造出 \([gcd(i,j)=1]\), 式子就变成了 \(\sum_{i=1}^{\left \lfloor \frac{n}{k} \right \rfloor} \sum_{j=1}^{\left \lfloor \frac{m}{k} \right \rfloor}[gcd(i,j)=1]\),代入结论一得到

\[\sum_{i=1}^{\left \lfloor \frac{n}{k} \right \rfloor} \sum_{j=1}^{\left \lfloor \frac{m}{k} \right \rfloor}[gcd(i,j)=1] =\sum_{i=1}^{\left \lfloor \frac{n}{k} \right \rfloor} \sum_{j=1}^{\left \lfloor \frac{m}{k} \right \rfloor}\sum_{d|i,d|j}\mu(d) \]

有效的数只有 \(d|i, d|j\), 那么可以把\(i\)和\(j\)都除以\(d\),我们就要枚举\(d\),式子就变成了

\[\sum_{d=1}^{\left \lfloor \frac{n}{k} \right \rfloor} \sum_{i=1}^{\left \lfloor \frac{n}{kd} \right \rfloor} \sum_{j=1}^{\left \lfloor \frac{m}{kd} \right \rfloor}\mu(d) \]

我们发现 \(\mu(d)\)只和\(\sum_{d=1}^{\left \lfloor \frac{n}{k} \right \rfloor}\)有关系, 那么就可以把\(\mu(d)\) 提取到前面

\[\sum_{d=1}^{\left \lfloor \frac{n}{k} \right \rfloor} \mu(d) \sum_{i=1}^{\left \lfloor \frac{n}{kd} \right \rfloor} \sum_{j=1}^{\left \lfloor \frac{m}{kd} \right \rfloor} 1 \]

这个时候后面的两个\(\sum\)就可以消去

\[\sum_{d=1}^{\left \lfloor \frac{n}{k} \right \rfloor} \mu(d) \left \lfloor \frac{n}{kd} \right \rfloor \left \lfloor \frac{m}{kd} \right \rfloor \]

结论三:\(\sum_{i=1}^{n} \sum_{j=1}^{m}lcm(i,j) = \sum_{d=1}^{min(n,m)}d \sum_{x=1}^{min(\lfloor \frac{n}{d} \rfloor,\lfloor \frac{m}{d} \rfloor)}x^{2}\mu(x) \sum_{i=1}^{\lfloor \frac{n}{dx} \rfloor} i\sum_{j=1}^{\lfloor \frac{m}{dx} \rfloor} j\)
证明: 第一步是将lcm转化成gcd,然后把公约数d提出(假设n比m小)

\[\begin{align*} \sum_{i=1}^{n} \sum_{j=1}^{m}lcm(i,j)&=\sum_{i=1}^{n} \sum_{j=1}^{m} \frac{ij}{gcd(i,j)} \\ &= \sum_{i=1}^{n} \sum_{j=1}^{m} \sum_{d|i,d|j} \frac{ij}{d} \\ &= \sum_{d=1}^{n}d^{2} \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j=1}^{\lfloor \frac{m}{d} \rfloor} [gcd(i,j) = 1] \frac{ij}{d} \\ &= \sum_{d=1}^{n}d \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j=1}^{\lfloor \frac{m}{d} \rfloor} [gcd(i,j) = 1] ij \\ \end{align*} \]

从n和m中取出d,所以前面要乘以一个\(d^{2}\),和后面的分母约掉一个,这个时候出现\([gcd(i,j)=1]\),就可以使用反演了。

\[\begin{align*} \sum_{d=1}^{n}d \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j=1}^{\lfloor \frac{m}{d} \rfloor} [gcd(i,j) = 1] ij &= \sum_{d=1}^{n}d \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j=1}^{\lfloor \frac{m}{d} \rfloor} \sum_{x|i,x|j} \mu(x) ij \\ &= \sum_{d=1}^{n}d \sum_{x=1}^{n} \mu(x) x^{2} \sum_{i=1}^{\lfloor \frac{n}{xd} \rfloor} \sum_{j=1}^{\lfloor \frac{m}{xd} \rfloor} ij \\ &= \sum_{d=1}^{n}d \sum_{x=1}^{n} \mu(x) x^{2} \sum_{i=1}^{\lfloor \frac{n}{xd} \rfloor} i \sum_{j=1}^{\lfloor \frac{m}{xd} \rfloor} j \end{align*} \]

x的提取和d的相同,到这里我们就化简完了,后面i和j的部分是O(1)的计算,对于d和x可以使用整除分块进行优化。
例题: https://www.luogu.com.cn/problem/P1829
代码如下

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1e7 + 10, mod = 20101009;

int prime[N], mu[N], cnt, sum[N];
bool st[N];

void init()
{
    int n = N - 10;
    mu[1] = 1;
    for (int i = 2; i <= n; i ++)
    {
        if (!st[i]) 
        {
            prime[++ cnt] = i;
            mu[i] = -1;
        }
        for (int j = 1; prime[j] * i <= n; j ++)
        {
            st[prime[j] * i] = true;
            if (i % prime[j] == 0)
            {
                mu[i * prime[j]] = 0;
                break;
            }
            mu[i * prime[j]] = -mu[i];
        }
    }
    for (int i = 1; i <= n; i ++)
        sum[i] = (sum[i - 1] + (i * i % mod * (mu[i] + mod) % mod)) % mod;
}

int Sum(int n, int m)
{
    int a = ((1 + n) * n / 2) % mod;
    int b = ((1 + m) * m / 2) % mod;
    return a * b % mod;
}

void solve()
{
    int n, m;
    cin >> n >> m;
    if (n > m) swap(n, m);
    int ans = 0;
    for (int d = 1; d <= n; d ++)
    {
        int res = 0;
        int maxn = n / d, maxm = m / d;
        for (int x = 1, y; x <= maxn; x = y + 1)
        {
            y = min(maxn / (maxn / x), maxm / (maxm / x));
            int p = ((sum[y] - sum[x - 1] + mod) % mod) * Sum(maxn / x, maxm / x) % mod;
            res = (res + p) % mod;
        }
        ans = (ans + d * res % mod) % mod;
    }
    cout << ans << "\n";
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    
    init();
    int T = 1;
    while (T --)
       solve();

}
posted @ 2024-06-25 19:23  からし  阅读(178)  评论(0)    收藏  举报