首页 > 其他分享 >莫比乌斯反演小记

莫比乌斯反演小记

时间:2023-09-27 19:57:03浏览次数:28  
标签:lfloor frac limits int sum mu 反演 莫比 小记

基本内容

莫比乌斯函数

\(\mu\) 定义为 \(1\) 的逆。

一些小性质:

  1. \(\mu * 1=\epsilon\)
  2. \(\mu * \text{id}=\varphi\)

反演内容

我的理解是:

\[[a=1]=\sum\limits_{d|a}\mu(d) \]

典型例题

例1 P2398 GCD SUM

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

来推下式子:

先枚举 \(\gcd\):

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

再将 \(d\) 除掉:

\[\sum\limits_{d=1}^n d \sum\limits_{i=1}^{\lfloor \frac{n}{d}\rfloor}\sum\limits_{j=1}^{\lfloor \frac{n}{d}\rfloor}[\gcd(i,j)=1] \]

然后莫比乌斯反演:

\[\sum\limits_{d=1}^n d \sum\limits_{i=1}^{\lfloor \frac{n}{d}\rfloor}\sum\limits_{j=1}^{\lfloor \frac{n}{d}\rfloor}\sum\limits_{k|\gcd(i,j)}\mu(k) \]

枚举 \(k\):

\[\sum\limits_{k=1}^n\mu(k)\sum\limits_{d=1}^n d \sum\limits_{i=1}^{\lfloor \frac{n}{d}\rfloor}\sum\limits_{j=1}^{\lfloor \frac{n}{d}\rfloor}[k|\gcd(i,j)] \]

将 \(k\) 除掉:

\[\sum\limits_{k=1}^n\mu(k)\sum\limits_{d=1}^n d \sum\limits_{i=1}^{\lfloor \frac{n}{dk}\rfloor}\sum\limits_{j=1}^{\lfloor \frac{n}{dk}\rfloor}*1 \]

令 \(T=dk\),整理一下:

\[\sum\limits_{T=1}^n\lfloor \frac{n}{T}\rfloor^2\sum\limits_{k|T}\mu(k)(\frac{T}{k}) \]

由于 \(\mu*\text{id}=\varphi\):

\[\sum\limits_{T=1}^n\lfloor \frac{n}{T}\rfloor^2\varphi(T) \]

欧拉函数可以直接线性筛预处理前缀和。中间的可以用整除分块 \(\Theta(\sqrt n)\)解决。

时间复杂度瓶颈在线性筛的 \(\Theta(n)\)。

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=2e5+5;

int n,cnt;
int prime[MAXN],vis[MAXN],phi[MAXN],sum[MAXN];

inline void init(int n)
{
    memset(vis,0,sizeof(vis));
    phi[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!vis[i])
        {
            prime[++cnt]=vis[i]=i;
            phi[i]=i-1;
        }
        for(int j=1;j<=cnt && i*prime[j]<=n;j++)
        {
            vis[i*prime[j]]=prime[j];
            if(i%prime[j]) phi[i*prime[j]]=phi[i]*(prime[j]-1);
            else phi[i*prime[j]]=phi[i]*prime[j];
        }
    }
    for(int i=1;i<=n;i++) sum[i]=sum[i-1]+phi[i];
    return;
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n;
    init(n);
    int ans=0;
    for(int l=1,r;l<=n;l=r+1)
    {
        r=n/(n/l);
        ans+=(sum[r]-sum[l-1])*(n/l)*(n/l);
    }
    printf("%lld\n",ans);
    return 0;
}

例2 P1829 [国家集训队] Crash的数字表格 / JZPTAB

求:

\[\sum\limits_{i=1}^n\sum\limits_{j=1}^m\text{lcm}(i,j) \]

这道题与上题差不多,因为 \(\text{lcm}(i,j)=\frac{i\times j}{\gcd(i,j)}\)。

推式子:

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=1e7+5;
const int MOD=20101009;

int n,m,cnt;
int prime[MAXN],vis[MAXN],mu[MAXN],sum[MAXN];

inline void init(int n)
{
    mu[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!vis[i]) {mu[i]=-1;prime[++cnt]=i;}
        for(int j=1;j<=cnt && i*prime[j]<=n;j++)
        {
            vis[i*prime[j]]=1;
            if(!(i%prime[j])) {mu[i*prime[j]]=0;break;}
            else 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;
    return;
}

inline int S(int r,int l=1) {return ((r+l)*(r-l+1)/2)%MOD;}
inline int Sum(int x,int y) {return ((x*(x+1)/2)%MOD)*((y*(y+1)/2)%MOD)%MOD;}

inline int solve(int x,int y)
{
    int ans=0;
    for(int l=1,r;l<=min(x,y);l=r+1)
    {
        int r1=x/(x/l),r2=y/(y/l);
        r=min(r1,r2);
        ans=(ans+(sum[r]-sum[l-1]+MOD)%MOD*Sum(x/r,y/r)%MOD)%MOD;
    }
    return ans;
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n>>m; init(min(n,m));
    int ans=0;
    for(int l=1,r;l<=min(n,m);l=r+1)
    {
        int r1=n/(n/l),r2=m/(m/l);
        r=min(r1,r2);
        ans=(ans+S(r,l)*solve(n/r,m/r)%MOD)%MOD;
    }
    printf("%lld\n",(ans+MOD)%MOD);
    return 0;
}

标签:lfloor,frac,limits,int,sum,mu,反演,莫比,小记
From: https://www.cnblogs.com/code-ac/p/17734177.html

相关文章

  • git blame 用法小记
    1、概述git管理的代码仓库,在协作开发中不可避免地会出现代码冲突,或者有新手错误地提交代码。出现问题不可怕,可怕的是找不到问题出在哪里。有时候找到出问题的代码,却不知道是谁提交的。git提供了一个有用的命令gitblame来帮你查看一个文件的每一行是如何被修改的,以及由谁修改......
  • loader编写小记
    此项目在一些大佬的基础上进行了修改,或许能提供一些思路。还在学习中很菜很菜,不足之处还请师傅们多多指点......
  • 动态DP小记
    前言矩阵乘法优化DP,重链剖分。涉及到的知识点是比较复杂的,但是比较重要。这是猫锟在WC2018讲的黑科技,一般用来解决树上的带有点权(边权)修改操作的DP问题,为了普及,甚至CSP2022-ST4考到了此知识点。做法朴素DP设\(dp_{i,0}\)表示不选\(i\),\(i\)的子树的最大权独立集......
  • 莫比乌斯反演乱写
    太久没有写莫反的题,忘完了。。。简单写写当总结常见数论函数\(e(x)=[x=1]\)\(I(x)=1\)\(id(x)=x\)以上函数完全积性\(\varphi(x)=\sum\limits_{i=1}^{x-1}[\gcd(i,x)==1]\)\(\mu=I^{-1}\)\(d(x)=\sum\limits_{i=1}^{x}[i\midx]\)以上是......
  • MSSQL 维护小记(清理进程、重建索引)
    ------------------------------清理进程----------------------------------- declare@deleteSleepSessionnvarchar(100)--申明一个变量declaretablelistcursorlocal--申明一个本地游标forselect'kill'+rtrim(spid)frommaster.dbo.sysprocesses--数据库系统进......
  • 「Log」2023.9.19 小记
    序幕\(\text{6:30}\):提前到校,昨晚题调不出来,今天直接暴走。拍题,平衡树区间和比值小,忘赋\(sum\)初值了\(\color{blueviolet}{P3586\[POI2015]\LOG}\)贪心构建询问策略\(\text{Link}\)间幕\(1\)模拟赛。今天题面都还算简洁,T1觉得是可做题,考虑到一种性质,\(x,y\)两数同......
  • PHP Apache配置小记
    Apache首先到Apacahe网站上下载Apache,然后打开Apache24文件夹,其中htdocs就是之后的网页文件夹(如果不修改的话),bin就是启动Apache服务器的文件夹,conf是配置文件夹,首先打开conf文件夹内的httpd.conf这是Apache的配置文件,按以下进行配置■到DefineSRVROOT一项,后面内容进行修改,设定A......
  • FWT 小记
    卷积通用定义:\[\text{令}F=G\timesH\text{。}\\\text{则有}f_i=\sum\limits_{x=0}^{n-1}\sum\limits_{y=0}^{n-1}g_xh_y[x\oplusy=i]\]若\(\oplus\)为\(+\),就是多项式乘法,可以使用FFT等手段解决。当\(\oplus\)为位运算时,则属于位运算卷积,可用FWT/FMT......
  • sepolicy进阶小记
    上下文定义标准的label取名方式是需要被遵守的,因为很多宏里面就直接用了。。hwservice_contexts这里标注的是使用hwbinder的服务通信的接口标准的label取名方式是以_hwservice结尾hwbinder是框架与供应商内容之间的ipc通信模块同理,还有个vndbinder,是供应商内容之间的......
  • 「学习笔记」莫比乌斯反演
    开新坑了。QWQ前置芝士:数论分块。(之后再说。QWQ)积性函数定义一个数论函数\(f(n)\)满足\(f(xy)=f(x)\timesf(y)\)(\(\gcd(x,y)=1\)),则称\(f(n)\)是积性函数。莫比乌斯函数:\(\mu(n)=\begin{cases}1&n=1\\0&n\\text{含有平方因子}\\(-1)^k&k\text{为}\n\\text{的......