积性函数
积性函数
(更新中)
定义
积性函数:对于函数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 \)代入式子可以得到:\(\\ \)
$\qquad $由 \(\mu\) 函数得到 \(c_{i}>1\) 时,\(\mu\) 的值是0,所以式子变成:
莫比乌斯反演
公式一
如果\(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) $代入 后面的式子得到
先把\(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]\),代入结论一得到
有效的数只有 \(d|i, d|j\), 那么可以把\(i\)和\(j\)都除以\(d\),我们就要枚举\(d\),式子就变成了
我们发现 \(\mu(d)\)只和\(\sum_{d=1}^{\left \lfloor \frac{n}{k} \right \rfloor}\)有关系, 那么就可以把\(\mu(d)\) 提取到前面
这个时候后面的两个\(\sum\)就可以消去
结论三:\(\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小)
从n和m中取出d,所以前面要乘以一个\(d^{2}\),和后面的分母约掉一个,这个时候出现\([gcd(i,j)=1]\),就可以使用反演了。
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();
}

浙公网安备 33010602011771号