数论18——反演定理(莫比乌斯反演)

数论18——反演定理(莫比乌斯反演)莫比乌斯反演也是反演定理的一种既然我们已经学了二项式反演定理那莫比乌斯反演定理与二项式反演定理一样 不求甚解 只求会用莫比乌斯反演长下面这个样子 d n 表示 n 能够整除 d 也就是 d 是 n 的所有因子 x 是莫比乌斯函数 它是这样计算的 1 1x p1 p2 p3 pk x 由 k 个不同的质数

莫比乌斯反演也是反演定理的一种

 

 

 

既然我们已经学了二项式反演定理

 

那莫比乌斯反演定理与二项式反演定理一样,不求甚解,只求会用

 

莫比乌斯反演长下面这个样子(=・ω・=)

 

莫比乌斯反演1

d|n,表示n能够整除d,也就是d是n的所有因子

 

μ(x)是莫比乌斯函数,它是这样计算的

μ(1) = 1 

x = p1 * p2 * p3 ……*pk(x由k个不同的质数组成)则μ(x) = (-1)^k 

其他情况,μ (x) = 0 

 

比如

30 = 2 * 3 * 5

μ(30) = (-1)^3 

4 = 2 * 2

μ(4) = 0

 

 

 

 

 

 

对于μ(d)函数,它有如下的常见性质:

 

    (1)对任意正整数n有

莫比乌斯反演2

    (2)对任意正整数n有 

 

 莫比乌斯反演3

 

 

 

 

求μ的函数的方法很多

这里提供一种线筛的预处理(复杂度O(n)哟~~~)

#include 
    
      const int N = 1e6 + 5; int mu[N], vis[N], prime[N]; int tot;//用来记录prime的个数 void init(){ mu[1] = 1; for(int i = 2; i < N; i ++){ if(!vis[i]){ prime[tot ++] = i; mu[i] = -1; } for(int j = 0; j < tot && i * prime[j] < N; j ++){ vis[i * prime[j]] = 1; if(i % prime[j]) mu[i * prime[j]] = -mu[i]; else{ mu[i * prime[j]] = 0; break; } } } } int main(){ init(); } 
    

  

上次,有人问我μ为啥不是miu是mu

这。。。当然都可以啦,μ的英文就是mu,miu是读音看你习惯

 

∑(っ °Д °;)っ为了证明我是对的,我特意百度了希腊字母读音及科学方面应用

大写
小写
英文读音
国际音标
意义
Α
α
alpha
/ˈælfə/
角度,系数,角加速度
Β
β
beta
/’beitə/
磁通系数,角度,系数
Γ
γ
gamma
/’gæmə/
电导系数,角度,比热容比
Δ
δ
delta
/’deltə/
变化量,屈光度,一元二次方程中的判别式
Ε
ε
epsilon
/ep’silon/
对数之基数,介电常数
Ζ
ζ
zeta
/’zi:tə/
系数,方位角,阻抗,相对粘度
Η
η
eta
/’i:tə/
迟滞系数,效率
Θ
θ
theta
/’θi:tə/
温度,角度
Ι
ι ℩
iota
/ai’oute/
微小,一点
Κ
κ
kappa
/kæpə/
介质常数,绝热指数
λ
lambda
/’læmdə/
波长,体积,导热系数
Μ
μ
mu
/mju:/
磁导系数,微,动摩擦系(因)数,流体动力粘度
Ν
ν
nu
/nju:/
磁阻系数,流体运动粘度,光子频率
Ξ
ξ
xi
/ksi/
随机数,(小)区间内的一个未知特定值
Ο
ο
omicron
/oumaik’rən/
高阶无穷小函数
π
pi
/pai/
圆周率,π(n)表示不大于n的质数个数
Ρ
ρ
rho
/rou/
电阻系数,柱坐标和极坐标中的极径,密度
σ ς
sigma
/’sigmə/
总和,表面密度,跨导,正应力
Τ
τ
tau
/tau/
时间常数,切应力
Υ
υ
upsilon
/ju:p’silən/
位移
Φ
φ
phi
/fai/
磁通,角,透镜焦度,热流量
Χ
χ
chi
/kai/
统计学中有卡方(χ^2)分布
Ψ
ψ
psi
/psai/
角速,介质电通量
Ω
ω
omega
/’oumigə/
欧姆,角速度,交流电的电角度

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

其实莫比乌斯有两种描述

莫比乌斯反演一

莫比乌斯第一种描述,一般是这种

莫比乌斯反演二

莫比乌斯第二种描述,这种也可以而且有些题这种更好

 

 

 

 

 

 

 

 

 

 

来做题吧

hdu 1695

http://acm.hdu.edu.cn/showproblem.php?pid=1695

 

(这题就是容斥那一章的,我就把下面的题意照搬过来了,还记得题目的就跳过题目吧) 

题意:给你5个数a,b,c,d,k

在a~b中选一个x, c~d中选一个y,满足gcd(x,y) = k , 求(x,y) 的对数 

a, b, c, d, k, 0 < a <= b <= 100,000, 0 < c <= d <= 100,000, 0 <= k <= 100,000

在题目描述的最后一行有一句话,多组里面所有的a和c都是1(这题目不是坑爹吗(╯‵□′)╯︵┻━┻那输入a和c有什么用)

然后题目变成

在1~b中选一个x, 1~d中选一个y,满足gcd(x,y) = k , 求(x,y) 的对数 。。。(无语中。。。)

 

 

 

 

 

 

 

 

前面思路一样

先把问题就转化为求1~a区间 和 1~b区间,gcd(x,y) = 1对数的问题

 

设f(d)为满足gcd(x,y)=d的x,y的对数

我们根据莫比乌斯第二描述来做

那F(1) = f(1) + f(2) + f(3) + ….

F(2) = f(2) + f(4) + f(6) +…..

我们可以看出F(d)就是满足gcd(x,y)为d的倍数的x,y的对数

那F(d)的公式就容易求了

F(d) = (a/d) * (b/d)

(在1~a中,有a/d个数是d的倍数,在1~b中,有b/d个数是d的倍数,这些数不管怎么选择,构成的gcd(x,y)都是d的倍数)

因为

 F(1) = f(1) + f(2) + f(3) + ….

所以

f(1) = μ(1)*F(1) + μ(2)*F(2) + μ(3)*F(3) + …

 

AC代码:

数论18——反演定理(莫比乌斯反演) 数论18——反演定理(莫比乌斯反演)

#include
      
    
      
      
      
      
      
       
     
       
       
       
       
        #include
       
     
       
       
       
       
        
        using 
        namespace 
         std; typedef  
        long 
        long 
         LL;  
        const 
        int N = 1e6 + 
        5 
        ;  
        int 
         mu[N], vis[N], prime[N];  
        int tot; 
        // 
        用来记录prime的个数 
        void 
         init(){ mu[ 
        1] = 
        1 
        ;  
        for( 
        int i = 
        2; i < N; i ++ 
        ){  
        if(! 
        vis[i]){ prime[tot ++] = 
         i; mu[i] = - 
        1 
        ; }  
        for( 
        int j = 
        0; j < tot && i * prime[j] < N; j ++ 
        ){ vis[i * prime[j]] = 
        1 
        ;  
        if(i % prime[j]) mu[i * prime[j]] = - 
        mu[i];  
        else 
        { mu[i * prime[j]] = 
        0 
        ;  
        break 
        ; } } } } LL Mobius( 
        int a, 
        int 
         b){ LL ret = 
        0 
        ;  
        for( 
        int i = 
        1; i <= a; i ++){ 
         
        // 
        因为公式中有a/i,所以for到a就可以了  ret += 1ll * mu[i] * (a / i) * (b / 
         i); }  
        // 
        我们现在求完了总对数,但是题目要求的类似(5,7)和(7,5)算一种  
        // 
        所以接下来我们开始去重 LL temp = 
        0 
        ;  
        for( 
        int i = 
        1; i <= a; i ++ 
        ){ temp += 1ll * mu[i] * (a / i) * (a / 
         i); }  
        return ret - temp / 
        2 
        ;  
        // 
        比如a=5,b=7那么(4,6)这样子的区间不可能有重复的(6,4)  
        // 
        所以重复的部分只在1~a中,所以最后减去一半的重复区间就好了  
        }  
        int 
         main(){ init();  
        int 
         T, a, b, c, d, k; scanf( 
        " 
        %d 
        ", & 
        T);  
        for( 
        int cas = 
        1; cas <= T; cas ++ 
        ){ scanf( 
        " 
        %d%d%d%d%d 
        ", &a, &b, &c, &d, & 
        k);  
        if(k == 
        0 
        ){ printf( 
        " 
        Case %d: 0\n 
        " 
        , cas);  
        continue 
        ; } b /= k; d /= 
         k;  
        if(b > 
         d) swap(b, d); printf( 
        " 
        Case %d: %I64d\n 
        " 
        , cas, Mobius(b, d)); } } 
       
      
    
      
      
      
      
      

View Code

 

/此处施工中//

暂时弃坑。。。。

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=94200#overview

峰神挂的莫比乌斯反演章节,有兴趣自己去做做,不会的去百度。。。。

转载于:https://www.cnblogs.com/xzxl/p/7354153.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208158.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午12:13
下一篇 2026年3月19日 下午12:13


相关推荐

  • 阿里云polardb_阿里云用的什么数据库

    阿里云polardb_阿里云用的什么数据库前言一年一度的数据库领域顶级会议VLDB2019于美国当地时间8月26日-8月30日在洛杉矶召开。在本届大会上,阿里云数据库产品团队多篇论文入选ResearchTrack和IndustrialTrack。本文将对入围IndustrialTrack的论文《AnalyticDB:RealtimeOLAPDatabaseSystematAlibabaCloud》进行深度…

    2025年12月9日
    4
  • nc瑞士军刀详情

    nc瑞士军刀详情查看头文件nc-nv0.0.0.0IP地址80端口号(类telnet功能)head/聊天功能(传输是明文)nc相互传输文本信息(两台电脑实现类聊天功能)A:nc-lp4444

    2022年7月2日
    27
  • Pycharm好用的插件汇总(简单实用)

    Pycharm好用的插件汇总(简单实用)Pycharm 好用的插件汇总 简单实用 Translation 翻译插件 进行中英互译 想看哪里 就选中哪里 然后使用组合键 Ctrl Shift Y 进行翻译 ChineseLangu 汉化插件 AiXcoderCode 代码补全插件 新手不建议使用 CSVplugin 通过灵活的表编辑器编辑 csv tsv psv 文件 语法验证 结构突出显示 可自定义的颜色 新意图和有用的检查 RainbowBrack 让括号等符号不同层之间显示不同 清楚辨别哪个括号是

    2026年3月17日
    2
  • B族智能

    B族智能

    2026年3月15日
    2
  • 飞鸽传书:谈谈RenderControl手动调用「建议收藏」

    飞鸽传书:谈谈RenderControl手动调用「建议收藏」有些网页需要在后台动态创建服务器控件,并且将控件的html代码写入到指定的HtmlTextWriter.如果仅是调用RenderControl方法能够将服务器控件的html内容输出,但它并不会执行OnPreRender,但是通常服务器控件都重写了OnPreRender方法,实现了许多重要的功能.我们不能将其舍弃啊.

    2022年7月21日
    9
  • 数据结构 || 二维数组按行存储和按列存储[通俗易懂]

    数据结构 || 二维数组按行存储和按列存储[通俗易懂]问题描述:设有数组A[n,m],数组的每个元素长度为3字节,n的值为1~8,m的值为1~10,数组从内存收地址BA开始顺序存放,请分别用列存储方式和行存储方式求A[5,8]的存储首地址为多少。解题说明:(1)为什么要引入以列序为主序和以行序为主序的存储方式?因为一般情况下存储单元是单一的存储结构,而数组可能是多维的结构,则用一维数组存储数组的数据元素就存…

    2022年7月16日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号