当前位置: 首页 > news >正文

关于Mobius反演

欧拉函数 \(\varphi\)

\(\varphi(n)=\)表示不超过 \(n\) 且与 \(n\) 互质的正整数的个数
\[\varphi(n)=n\cdot \prod_{i=1}^{s}(1-\frac{1}{p_i})\]
其中 \(n = {p_1}^{\alpha1} \cdot {p_2}^{\alpha2} \cdots {p_s}^{\alpha s} \cdot\)\(n\) 的标准分解。
由此易见 \(\text{Euler}\) 函数是积性函数。

线性求 \(\text{Euler}\) 函数:

#define int long long
int phi[3000005];
int n=3000000;
bool mark[3000005];
int prime[1000005];
int tot;
void getphi()
{
    phi[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(mark[i]==false)
        {
            prime[++tot]=i;
            phi[i]=i-1;
        }
        for(int j=1;j<=tot;j++)
        {
            if(i*prime[j]>n)
            {
                break;
            }
            mark[i*prime[j]]=true;
            if(i%prime[j]==0)
            {
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
            phi[i*prime[j]]=phi[i]*phi[prime[j]];
        }
    }
    for(int i=1;i<=n;i++)
    {
        phi[i]+=phi[i-1];
    }
}

\(\text{Mobius}\)函数 \(\mu(n)\)

\[ \mu(n)= \begin{cases} 1&n=1\\ 0&n\text{ 含有平方因子}\\ (-1)^k&k\text{ 为 }n\text{ 的本质不同质因子个数}\ \end{cases} \]
证明:
\[ \varepsilon(n)= \begin{cases} 1&n=1\\ 0&n\neq 1\ \end{cases} \]

其中 \(\displaystyle\varepsilon(n)=\sum_{d\mid n}\mu(d)\)\(\varepsilon=\mu*1\)

\(\displaystyle n=\prod_{i=1}^k{p_i}^{c_i},n'=\prod_{i=1}^k p_i\)

那么 \(\displaystyle\sum_{d\mid n}\mu(d)=\sum_{d\mid n'}\mu(d)=\sum_{i=0}^k C_k^i\cdot(-1)^k\)

根据二项式定理,易知该式子的值在 \(k=0\)\(n=1\) 时值为 \(1\) 否则为 \(0\) ,这也同时证明了 \(\displaystyle\sum_{d\mid n}\mu(d)=[n=1]\)

#define int long long
int mu[3000005];
int n=3000000;
bool mark[3000005];
int prime[1000005];
int tot;
void getmu()
{
    mu[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(mark[i]==false)
        {
            prime[++tot]=i;
            mu[i]=-1;
        }
        for(int j=1;j<=tot;j++)
        {
            if(i*prime[j]>n)
            {
                break;
            }
            mark[i*prime[j]]=true;
            if(i%prime[j]==0)
            {
                mu[i*prime[j]]=0;
                break;
            }
            mu[i*prime[j]]=-mu[i];
        }
    }
}

\(\text{Dirichlet}\)卷积

\(\text{ID}:\text{ID(i)=i}\)
\(\text{1}:\text{1(i)=1}\)
定义两个数论函数的\(\text{Dirichlet}\)卷积为:
\[(f*g)(n)=\sum_{d|n}({f(d)\times g(\frac{n}{d})}) \]
性质:\(\text{Dirichlet}\)卷积满足交换律和结合律。
单位元:\(\varepsilon\)\(\varepsilon(n)=[n==1]\),任何函数卷\(\varepsilon\)都为其本身.
\(1*\mu=\varepsilon\)
\(\mu * \text{ID} = \varphi\)
\(1*\text{ID}=\sigma\)

莫比乌斯反演

公式:设 \(f(n),g(n)\) 为两个数论函数。
如果有
\[ f(n)=\sum_{d\mid n}g(d) \]
那么有
\[ g(n)=\sum_{d\mid n}\mu(\frac{n}{d})f(d) \]
证明:
原命题等价于:已知 \(f=g*1\) ,证明 \(g=f*\mu\)
显然: \(f*\mu=g*1*\mu= g*\varepsilon=g\) (其中 \(1*\mu=\varepsilon\)

同时,还有另一种\(\text{Mobius}\)反演:
如果有
\[ f(n)=\sum_{n\mid d}g(d) \]
那么有
\[ g(n)=\sum_{n\mid d}\mu(\frac{d}{n})f(d) \]

整除分块

当遇到形如
\[\sum_{i=1}^{n}\lfloor \frac{n}{i} \rfloor\]
的柿子时。
可以采用\(O(\sqrt {n})\)复杂度的算法:整除分块
易证:对于部分连续的\(i\)\(\frac{n}{i}\)的值是相同的,考虑把它们合并计算,可以发现发现对于每一个值相同的块,它的最后一个数是n/(n/i)
简略证明:\(\frac{n}{i}\)就是所求的值,设为\(x\),那么可证对于值\(x\),它所在的块的最后一个数是\(\frac{n}{x}\)

  • 证明:反证法:对于数\(\frac{n}{x}+1\),它所在的块的值为\(\frac{n}{\frac{n}{x}+1}\),且\(\frac{n}{\frac{n}{x}+1}-x=\frac{x^2}{n+x}>0\)。$\therefore \text{数} \frac{n}{x}+1 \text{和数} \frac{n}{x} $ 不在同一个块中。
    然后,原命题得证。

所以,易得计算原式方法。

for(int l=1,r;l<=n;l=r+1)
{
    r=n/(n/l);
    ans+=(r-l+1)*(n/l);
}

P2257 YY的GCD

\(f(d)=\sum_{i=1}^{n}\sum_{i=1}^{m}[gcd(i,j)=d]\)
\(F(n)=\sum_{n\mid d}f(d)=\lfloor \frac{N}{n} \rfloor \times \lfloor \frac{M}{n} \rfloor\)
由莫比乌斯反演:\(f(n)=\sum_{n|d}\mu(\frac{d}{n})F(d)\)

\(Ans=\sum_{i=1}^{n}\sum_{i=1}^{m}[gcd(i,j)=prim]\)
\(=\sum_{p\in prim}\sum_{i=1}^{n}\sum_{i=1}^{m}[gcd(i,j)=p]\)
\(=\sum_{p\in prim}f(p)\)
\(=\sum_{p\in prim}\sum_{p|d}\mu(\frac{d}{p})F(d)\)
改为枚举\(\frac{d}{p}\)
\(Ans=\sum_{p\in prim}\sum_{d}^{min(\lfloor \frac{n}{p} \rfloor,\lfloor \frac{m}{p} \rfloor)}\mu(d)F(dp)\)
\(=\sum_{p\in prim}\sum_{d}^{min(\lfloor \frac{n}{p} \rfloor,\lfloor \frac{m}{p} \rfloor)}\mu(d) \times \lfloor \frac{N}{dp} \rfloor \times \lfloor \frac{M}{dp} \rfloor\)
\(dp=T,t=p\)
\(Ans=\sum_{t\in prim}\sum_{d}^{min(\lfloor \frac{n}{t} \rfloor,\lfloor \frac{m}{t} \rfloor)}\mu(\frac{T}{t}) \times \lfloor \frac{N}{T} \rfloor \times \lfloor \frac{M}{T} \rfloor\)
\(=\sum_{T=1}^{min(n,m)}\sum_{t\in prim,t|T}\mu(\frac{T}{t}) \times \lfloor \frac{N}{T} \rfloor \times \lfloor \frac{M}{T} \rfloor\)
\(=\sum_{T=1}^{min(n,m)}(\lfloor \frac{N}{T} \rfloor \times \lfloor \frac{M}{T} \rfloor) \times \sum_{t\in prim,t|T}\mu(\frac{T}{t})\)

代码:
//sum即为\(\sum_{t\in prim,t|T}\mu(\frac{T}{t})\)的前缀和

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int prime[10000005];
int mu[10000005];
ll f[10000005];
ll sum[10000005];
bool vis[10000005];
int cnt;
void init()
{
    mu[1]=1;
    for(int i=2;i<=10000000;i++)
    {
        if(vis[i]==false)
        {
            mu[i]=-1;
            prime[++cnt]=i;
        }
        for(int j=1;j<=cnt&&i*prime[j]<=10000000;j++)
        {
            vis[i*prime[j]]=true;
            if(i%prime[j]==0)
            {
                break;
            }
            mu[i*prime[j]]=-mu[i];
        }
    }
    for(int i=1;i<=cnt;i++)
    {
        for(int j=1;j*prime[i]<=10000000;j++)
        {
            f[j*prime[i]]+=mu[j];
        }
    }
    for(int i=1;i<=10000000;i++)
    {
        sum[i]=sum[i-1]+f[i];
    }
}
ll solve(int a,int b)//运用整除分块
{
    ll ans=0;
    if(a>b)
    {
        swap(a,b);
    }
    for(int l=1,r=0;l<=a;l=r+1)
    {
        r=min(a/(a/l),b/(b/l));
        ans+=(ll)(sum[r]-sum[l-1])*(a/l)*(b/l);
    }
    return ans;
}
signed main()
{
    init();
    int T;
    cin>>T;
    for(int i=1;i<=T;i++)
    {
        int a,b;
        scanf("%d %d",&a,&b);
        printf("%lld\n",solve(a,b));
    }
    return 0;
}

常用柿子(待补充)

\[[\gcd(x,y)=1]=\sum_{d|x,d|y}\mu(d)\]

转载于:https://www.cnblogs.com/wasa855/p/10392439.html

相关文章:

  • 常用的正则表达式
  • 四边形不等式优化-石子合并
  • 机器学习笔记(一)线性回归
  • 【OCP-12c】CUUG 071题库考试原题及答案解析(18)
  • 锋利的jQuery-7--编写插件基础知识
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • 【持续跟新】剑指Offer_Java实现
  • js,jq发送短信倒计时
  • Ubuntu软件包管理命令全面集锦
  • 资深项目经理推荐的几款免费/开源项目管理工具
  • Linux上mysql修改密码
  • V4L2视频输入框架概述
  • 20171107--SQL变量,运算符,存储过程
  • 国内首例:飞步无人卡车携手中国邮政、德邦投入日常运营
  • 过了半年才写了篇博客,我心情也很悲伤啊,加班加到死,已经浑浑噩噩了
  • php的引用
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • JavaScript的使用你知道几种?(上)
  • js中的正则表达式入门
  • leetcode46 Permutation 排列组合
  • mac修复ab及siege安装
  • Mocha测试初探
  • Python学习之路13-记分
  • Python语法速览与机器学习开发环境搭建
  • Redux 中间件分析
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • SQLServer之索引简介
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 算法之不定期更新(一)(2018-04-12)
  • Prometheus VS InfluxDB
  • 阿里云服务器如何修改远程端口?
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #if 1...#endif
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (理论篇)httpmoudle和httphandler一览
  • (强烈推荐)移动端音视频从零到上手(下)
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .Net 4.0并行库实用性演练
  • .NET CORE Aws S3 使用
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET中GET与SET的用法
  • .project文件
  • .so文件(linux系统)
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • @media screen 针对不同移动设备