Dirichlet卷积

莫比乌斯反演的前置知识

定义

f , g f,g f,g是数论函数,考虑数论函数 h h h满足

h ( n ) = ∑ d ∣ n f ( d ) g ( n d ) h(n)=\sum_{d|n}f(d)g(\frac{n}{d}) h(n)=dnf(d)g(dn)

则称 h h h f f f g g g的狄利克雷卷积,记作 h = f ∗ g h=f*g h=fg,这里的 ∗ * 表示卷积。

比如 h ( 6 ) = f ( 1 ) ∗ g ( 6 ) + f ( 2 ) ∗ g ( 3 ) + f ( 3 ) ∗ g ( 2 ) + f ( 6 ) ∗ g ( 1 ) h(6)=f(1)*g(6)+f(2)*g(3)+f(3)*g(2)+f(6)*g(1) h(6)=f(1)g(6)+f(2)g(3)+f(3)g(2)+f(6)g(1)

性质

  1. 单位函数 ϵ \epsilon ϵ是狄利克雷卷积的单位元,即对于任意函数 f f f,有 ϵ ∗ f = f ∗ ϵ = f \epsilon*f=f*\epsilon=f ϵf=fϵ=f
  2. 狄利克雷卷积满足交换律和结合律。
  3. 如果 f , g f,g f,g都是积性函数,那么 f ∗ g f*g fg也是积性函数。

许多关系都可以用狄利克雷卷积来表示。

下面用 1 1 1来表示取值恒为 1 1 1的常函数,定义幂函数 Id k ( n ) = n k , Id=Id 1 \text{Id}_{k}(n)=n^k,\text{Id=Id}_1 Idk(n)=nk,Id=Id1

除数函数的定义可以写为:

σ k = 1 ∗ Id k \sigma_k=1*\text{Id}_k σk=1Idk

欧拉函数的性质可以写为:

Id = φ ∗ 1 \text{Id}=\varphi*1 Id=φ1

计算狄利克雷卷积

f , g f,g f,g是数论函数,计算 f f f g g g的狄利克雷卷积在 n n n处的值需要枚举 n n n的所有约数。

如果要计算 f f f g g g的狄利克雷卷积的前 n n n项,可以枚举 1 1 1 n n n中每个数的倍数,根据调和数的相关结论,这样做的复杂度是 O ( n log ⁡ n ) O(n\log n) O(nlogn)

求函数的逆

狄利克雷卷积有一个性质:对每个 f ( 1 ) ≠ 0 f(1)\neq0 f(1)=0的函数 f f f,都存在一个函数 g g g使得 f ∗ g = ϵ f\ast g=\epsilon fg=ϵ

那么我们如何求出一个函数的逆呢?

只需要定义:

g ( n ) = 1 f ( 1 ) ( [ n = 1 ] − ∑ i ∣ n , i ≠ 1 f ( i ) g ( n i ) ) g(n)=\frac 1{ f(1)}\left([n=1]-\sum\limits_{i\mid n, i\neq1} f(i) g\left(\frac ni\right)\right) g(n)=f(1)1[n=1]in,i=1f(i)g(in)

这样的话

∑ i ∣ n f ( i ) g ( n i ) = f ( 1 ) g ( n ) + ∑ i ∣ n , i ≠ 1 f ( i ) g ( n i ) = [ n = 1 ] \begin{aligned}&\quad\sum_{i\mid n} f(i) g\left(\frac ni\right)\\&= f(1) g(n)+\sum_{i\mid n,i\neq1} f(i) g\left(\frac ni\right)\\&=[n=1]\end{aligned} inf(i)g(in)=f(1)g(n)+in,i=1f(i)g(in)=[n=1]

最后一步直接把 g ( n ) g(n) g(n)的定义带进去就好

= f ( 1 ) ∗ 1 f ( 1 ) ( [ n = 1 ] − ∑ i ∣ n , i ≠ 1 f ( i ) g ( n i ) ) + ∑ i ∣ n , i ≠ 1 f ( i ) g ( n i ) = f(1)*\frac{1}{ f(1)}([n = 1] - \sum\limits_{i|n,i\neq1} f(i) g(\frac n i))+ \sum\limits_{i|n,i\neq1} f(i) g(\frac ni) =f(1)f(1)1([n=1]in,i=1f(i)g(in))+in,i=1f(i)g(in)

例题

P2303 [SDOI2012]Longge的问题

给定正整数 n n n,求

∑ i = 1 n g c d ( i , n ) , n ≤ 2 32 \sum_{i=1}^{n}gcd(i,n),n\leq2^{32} i=1ngcd(i,n),n232


枚举 gcd \text{gcd} gcd

KaTeX parse error: No such environment: align* at position 7: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \sum_{i=1}^{…

枚举 n n n的约数直接求。答案是积性的。

#include <cmath> 
#include <cstdio>
#include <cstring> 
#include <iostream>
#define int long long
using namespace std;

inline int read() {
	char c = getchar(); int x = 0, f = 1;
	for ( ; !isdigit(c); c = getchar()) if(c == '-') f = -1; 
	for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
	return x * f;
}

int n, ans;

int euler(int x) {
	int ans = x, rt = sqrt(x);
	for (int i = 2; i <= rt; i++) {
		if (x % i == 0) {
			ans = ans - ans / i;
			while (x % i == 0) x /= i;
		}
	}
	if (x > 1) ans = ans - ans / x;
	return ans;
}

signed main() {
	n = read();
	int x = sqrt(n);
	for (int i = 1; i <= x; i++) {
		if (n % i == 0) {
			ans += euler(n / i) * i;
			if (i * i != n) ans += euler(i) * (n / i);
		}
	}
	cout << ans << '\n';
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值