算法随笔——数论之莫比乌斯反演

链接
链接2
链接3
链接4

前置知识:

数论分块

可以求形如:f(i)g(n/i) 的东西。
原理如下:
比如说求 i=11010/i
得到:10 5 3 2 2 1 1 1 1 1
可以发现有一些块的数值是一样的。
具体一点可以发现 [l,nnl] 里的数值都是一样的。
又因为这样的值只有 n 个,因此这个式子可以在 O(n) 的复杂度算出来.

int sum(int n)
{
	int res = 0;
	for (int i = 1,r;i <= n;i = r + 1)
	{
		r = n/(n/i);
		res += ...//计算贡献
	}
	return res;
}

狄利克雷卷积

一些数论函数:
ϵ(n) : [n=1]
I(n):任何情况下,I(n)=1
id(n): id(n)=n
φ(n) : 欧拉函数, [1,n] 之内与 n 互质的整数的个数.单点求解欧拉函数

点击查看代码
int get_euler(int n)
{
    phi[1] = 1;
    for (int i = 2;i <= n;i++)
    {
        if (!vis[i]) 
        {
            prime[cnt++] = i;
            phi[i] = i - 1; 
        }
        for (int j = 0;prime[j]<= n/i;j++)
        {
            vis[prime[j] * i] = 1;
            if (i % prime[j] == 0)
            {
                phi[i*prime[j]] = phi[i] * prime[j];
                break;
            }
            phi[prime[j] * i] = phi[i] * (prime[j]-1);
        }
    }
    return res;
}

莫比乌斯函数 μ
image
筛法:

点击查看代码
void euler(int n)
{
	mu[1] = 1;
	for (int i = 2;i <= n;i++)
	{
		if (!vis[i]) primes[cnt++] = i,mu[i] = -1;
	 	for (int j = 0;primes[j] <= n / i;j++)
	 	{
	 		int num = i * primes[j];
	 		vis[num] = 1;
	 		if (i % primes[j] == 0)
	 		{
	 			mu[num] = 0;
	 			break;
	 		}
	 		mu[num] = -mu[i];
	 	}		
	}
}

σ(n) 约数和函数:σ(n)=d|nd

狄利克雷卷积

(fg)(n)=d|nf(d)×g(nd)

则有:

μI=ϵ

φI=id

μid=φ

fϵ=f

Iid=σ

ϵ 是单位函数,μI 互为逆元。
同时可以发现狄利克雷卷积满足交换律、分配律和结合律。

例题1

μI=ϵ

image
image

例题2

φI=id

image

例题3

μI=ϵ

image

posted @   codwarm  阅读(8)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示