hdu 1695 GCD(莫比乌斯反演经典入门||容斥原理+欧拉函数)

莫比乌斯函数ACM 莫比乌斯入门请耐心往下看: OK.现在可以开始刷题了。 莫比乌斯反演   HDU 1695 GCD 从区间[1, b]和[1,d]中分别选一个x, y,使得gcd(x, y) == k, 求满足条件的xy的对数(不区分xy的顺序) 分析:转换成求[1,b/k],[1,d/k]中gcd(x,y)==1的(x,y) 阅读详情

GCD

 Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. GCD(x, y) means the greatest common divisor of x and y. Since the number of choices may be very large, you're only required to output the total number of different number pairs.
Please notice that, (x=5, y=7) and (x=7, y=5) are considered to be the same.

Yoiu can assume that a = c = 1 in all test cases.

Input
The input consists of several test cases. The first line of the input is the number of the cases. There are no more than 3,000 cases.
Each case contains five integers: a, b, c, d, k, 0 < a <= b <= 100,000, 0 < c <= d <= 100,000, 0 <= k <= 100,000, as described above.
Output
For each test case, print the number of choices. Use the format in the example.
Sample Input

2
1 3 1 5 1
1 11014 1 14409 9

Sample Output

Case 1: 9
Case 2: 736427

Hint

For the first sample input, all the 9 pairs of numbers are (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 5), (3, 4), (3, 5).

题意:

题意:
给你5的数a,b,c,d,k ,其中a和c默认为1,求[a,b]和[c,d]两个区间有多少对数(x,y)使得gcd(x,y)==k,其中x属于[a,b],y属于[c,d]。

分析:

方法1:容斥原理+欧拉函数

根据题意让求在区间 [a,b],[c,d] [ a , b ] , [ c , d ] 中选两个数 x,y x , y 使得 gcd(x,y)=k g c d ( x , y ) = k 得

可以求 gcd(xk,yk)=1 g c d ( x k , y k ) = 1

因此问题转化成了求区间 [1,bk],[1,dk] [ 1 , b k ] , [ 1 , d k ] 中选两个数使得两个数互质的个数

为了防止重复,可以把区间分成两部分的和即 [1,bk]⋃[bk+1,dk] [ 1 , b k ] ⋃ [ b k + 1 , d k ]

对于前一个区间我们完全可以通过欧拉函数求解,计算前缀和便是前一个区间的互质个数,同时消除了重复的影响,因为这个区间只计算了一次

对于后一个区间我们利用容斥原理枚举 [bk+1,dk] [ b k + 1 , d k ] 中的每个数,然后和 bk b k 进行容斥

之后的内容就和HDU 2841 Visible Trees的做法一样了。

当然了,也完全可以不使用欧拉函数在一开始就用容斥定理,计算区间 [1,bk],[1,dk] [ 1 , b k ] , [ 1 , d k ] 中的互质数对个数,那么和上面那个HDU2841的做法就一模一样了。不解释了

解法1:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+10;
ll phi[maxn];
void init(){
    phi[1] = 1;
    for(ll i = 2; i < maxn; i++){
        phi[i] = i;
    }
    for(ll i = 2; i < maxn; i++){
        if(phi[i] == i){
            for(ll j = i; j < maxn; j += i){
                phi[j] = phi[j] / i * (i - 1);
            }
        }
    }
    for(ll i = 2; i < maxn; i++){
        phi[i] += phi[i-1];
    }
}
ll prime[maxn],cnt;
ll solve(ll m,ll n){
    cnt = 0;
    for(ll i = 2; i * i <= n; i++){
        if(n % i == 0){
            prime[cnt++] = i;
            while(n % i == 0) n /= i;
        }
    }
    if(n > 1) prime[cnt++] = n;
    ll res = 0;
    for(ll i = 1; i < (1<<cnt); i++){
        ll tmp = 1,num = 0;
        for(ll j = 0; j < cnt; j++){
            if(i & (1<<j)){
                tmp *= prime[j];
                num++;
            }
        }
        if(num & 1) res += m / tmp;
        else res -= m / tmp;
    }
    return m - res;
}
int main(){
    init();
    ll t,a,b,c,d,k,cas = 0;
    scanf("%lld",&t);
    while(t--){
        scanf("%lld%lld%lld%lld%lld",&a,&b,&c,&d,&k);
        if(k == 0 || k > b || k > d){
            printf("Case %lld: 0\n",++cas);
            continue;
        }
        b /= k;
        d /= k;
        if(b > d) swap(b,d);
        ll ans = 0;
        for(ll i = b+1; i <= d; i++){
            ans += solve(b,i);
        }
        printf("Case %lld: %lld\n",++cas,phi[b]+ans);
    }
    return 0;
}

方法二:莫比乌斯反演

其实更想写一下莫比乌斯反演的做法,因为这道题据称是莫比乌斯反演的入门题,恰好昨天看了组合数学那么本书上莫比乌斯反演那一部分(毫无疑问一点没看懂),这道题就当是个开始吧

莫比乌斯反演存在两个公式

约数公式:

F(n)=∑d|nf(d)⟶f(n)=∑d|nμ(d)F(nd) F ( n ) = ∑ d | n f ( d ) ⟶ f ( n ) = ∑ d | n μ ( d ) F ( n d ) (d是n的约数)

倍数公式:

F(n)=∑n|df(d)⟶f(n)=∑n|dμ(dn)F(d) F ( n ) = ∑ n | d f ( d ) ⟶ f ( n ) = ∑ n | d μ ( d n ) F ( d ) (d是n的倍数)

我们可以发现这两个公式中都有一个重要的共同的函数就是 μ() μ ( ) 函数

我们给出它的定义即性质:

这里写图片描述

那么这时回到原来的题目上来,根据方法1的分析,我们知道将b,d进行除k后,等价于求满足 gcd(x,y)=1 g c d ( x , y ) = 1 的个数

直接求解上面的问题比较困难,但是如果我们求满足 gcd(x,y)=1的倍数 g c d ( x , y ) = 1 的 倍 数 就会非常简单

下面我们设 f(d) f ( d ) 表示满足 gcd(x,y)=d g c d ( x , y ) = d 的个数
F(d) F ( d ) 表示满足 gcd(x,y)=d的倍数的个数 g c d ( x , y ) = d 的 倍 数 的 个 数

对于 F(x) F ( x ) 这个函数是好求的

因为对于区间 [1,n] [ 1 , n ] 来说,能够被x或者x的倍数整除的数(即含有x或者x的倍数作为因子)的个数为
nx n x ,同理对于区间 [1,m] [ 1 , m ] 来说能被x或者x的倍数整除的数的个数为 mx m x

∴F(x)=nx⋅mx ∴ F ( x ) = n x ⋅ m x

那么对于这道题目来说 n=bk,m=dk n = b k , m = d k

到此我们发现我们设的两个函数 F(x),f(x) F ( x ) , f ( x ) 满足莫比乌斯反演,并且满足的是倍数公式:

F(n)=∑n|df(d)⟶f(n)=∑n|dμ(dn)F(d) F ( n ) = ∑ n | d f ( d ) ⟶ f ( n ) = ∑ n | d μ ( d n ) F ( d )

n=1,d n = 1 , d 便是1的倍数

所以我们要求:

f(1)=∑1|dμ(d1)F(d) f ( 1 ) = ∑ 1 | d μ ( d 1 ) F ( d )

=μ(1)⋅F(1)+μ(2)⋅F(2)+⋯+μ(min(m,n))⋅F(min(m,n)) = μ ( 1 ) ⋅ F ( 1 ) + μ ( 2 ) ⋅ F ( 2 ) + ⋯ + μ ( m i n ( m , n ) ) ⋅ F ( m i n ( m , n ) )

直接for循环枚举 1−min(bk,dk) 1 − m i n ( b k , d k ) 即可

但是很明显会有重复的现象

而重复的原因是出现了类似这种在重叠区间中求解就会出现重复的重复了两次我们需要减掉一次

这里写图片描述

因此我们可以在重复区间即公共区间(因为都是从1开始,那么公共区间就是上届小的区间)再利用莫比乌斯反演求一遍,此时仍然是求了两边的值,我们只需要除2,然后用上面的答案减去就行了

普通筛选法:

void Init(){
    mu[1]=1;
    for(int i=1;i<=n;i++){
        for(int j=2*i;j<=n;j+=i){
            mu[j]-=mu[i];
        }
    }
}

下面是线性筛选莫比乌斯函数的模板 时间复杂度O(n)

    void Init(){
        int N=maxn;
        memset(prime,0,sizeof(prime));
        memset(mu,0,sizeof(mu));
        memset(vis,0,sizeof(vis));
        mu[1] = 1;
        cnt = 0;
        for(int i=2; i<N; i++){
            if(!vis[i]){
                prime[cnt++] = i;
                mu[i] = -1;
            }
            for(int j=0; j<cnt&&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;
                }
            }
        }
    }

题解code:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+7;
bool vis[maxn];
int prime[maxn],mu[maxn];
int cnt;
void init(){
    memset(prime,0,sizeof(prime));
    memset(mu,0,sizeof(mu));
    memset(vis,0,sizeof(vis));
    mu[1] = 1;
    cnt = 0;
    for(int i = 2; i < maxn; i++){
        if(!vis[i]){
            prime[cnt++] = i;
            mu[i] = -1;
        }
        for(int j = 0; j < cnt && i * prime[j] < maxn; 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();
    int a,b,c,d,k;
    int t,cas = 0;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
        if(k == 0 || k > b || k > d){
            printf("Case %d: 0\n",++cas);
            continue;
        }
        b /= k;
        d /= k;
        ll ans1 = 0,ans2 = 0;
        for(int i = 1; i <= min(b,d); i++){
            ans1 += (ll)mu[i] * (b / i) * (d / i);
        }
        for(int i = 1; i <= min(b,d); i++){
            ans2 += (ll)mu[i] * (min(b,d) / i) * (min(b,d) / i);
        }
        printf("Case %d: %lld\n",++cas,ans1-ans2/2);
    }
    return 0;
}
容斥原理/莫比乌斯反演/欧拉函数/线性筛专题 欧拉函数 线性筛 杜教筛 莫比乌斯反演 容斥原理 HDU2588 GCD 欧拉函数 给定N,M,求1&lt;=X&lt;=N 且gcd(X,N)&gt;=M条件下X的个数 #include&lt;bits/stdc++.h&gt; using namespace std; int euler(int n) { int ans=n; for(int i=2;i*i&... 阅读详情

相关推荐

本地大模型部署实战:LM Studio与Ollama的易用性与性能深度评测

本文对两款主流本地大模型部署工具LM Studio和Ollama进行了深度评测。LM Studio凭借图形化界面和内置模型库,为新手提供了开箱即用的便捷体验,并支持OpenAI兼容API,易于生态集成。Ollama则以命令行驱动,轻量高效,凭借其原生API和Modelfile自定义能力,在自动化集成和性能方面表现突出。文章从易用性、模型生态、性能及扩展性多维度对比,帮助用户根据自身技术背景和使用场景做出最佳选择。

weixin_29039773的博客 528

HDU - 1695 - GCD - (容斥定理,欧拉函数)

  Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. GCD(x, y) means the greatest common divisor of x and y. Since the number of choices may be very large, you...

Orz 386

SAP FICO - 外币交易实战:汇率类型配置与货币换算率管理

月底关账前的外币评估就像财务人的"期末考",OB59配置就是你的备考方案。最低值原则(Lowest value principle)最保守。它会比较原始汇率与评估日汇率,取不利方向确认损失。适合风险厌恶型企业,我在制造业客户中应用最多。重估法(Revalue only)更反映市场现状。无论盈亏都按最新汇率调整,适合交易性金融资产处理。有个基金公司客户就靠这个方法及时反映了外汇波动收益。最小差异金额(Minimum difference)是防骚扰设置。

weixin_42524708的博客 355

GCD (HDU-1695)(莫比乌斯反演)

Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. GCD(x, y) means the greatest common divisor of x and y. Since the number of choices may be very large, you're...

菜鸡的博客 548

国产数据库迁移必看:达梦到ES的CDC方案优化全记录(含完整代码)

本文详细记录了从达梦数据库到Elasticsearch的CDC方案优化全过程,涵盖触发器方案局限性、Debezium架构优势及完整代码实现。通过Flink集成和性能调优,实现毫秒级延迟同步,显著降低数据库负载,为国产数据库迁移提供可落地的技术方案。

weixin_29079671的博客 497

YOLOv8/YOLOv11目标检测系统与多目标跟踪检测系统,使用PySide6搭建目标检测系统,支持目标检测、分割、姿势估计、旋转框,用户端系统+后台管理系统可用于大论文凑工作量或毕设必备

YOLOv8/YOLOv11目标检测系统与多目标跟踪检测系统,目标检测、分割、姿势估计、obb(旋转框),用户端系统+后台管理系统开发实战,可用于大论文凑工作量或毕设必备,全网最详细教程,系统支持 目标检测、分割、姿势估计、obb(旋转框)等模型进来检测,是一个通用的目标跟踪与目标检测系统,适配多种场景如:鱼苗检测与跟踪、行人多目标跟踪、车辆多目标跟踪、牛只行为识别与跟踪、口罩佩戴检测、安全帽佩戴检测、火灾检测等。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1万+

GCD (HDU - 1695 容斥原理和欧拉函数)

Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. GCD(x, y) means the greatest common divisor of x and y. Since the number of choices may be very large, you're...

qq_41129854的博客 713

Ollama DNS 重新绑定攻击 (CVE-2024-28224)

一旦 DNS 重新绑定攻击成功,攻击者就可以对这些 API 进行排序,以读取 Ollama 运行的进程可访问的任意文件数据,并将这些数据泄露到攻击者控制的系统中。完成对“创建模型” API 请求的调用后,Ollama 将收集组成新创建的用户模型的许多工件,包括大型语言模型数据、许可证数据等,以及我们要提取的文件,所有这些都可以通过其 SHA256 内容进行寻址。这是我们要窃取的文件,在我们的示例中,是可通过运行 Ollama 的主机上的路径名访问的现有文本文件。值得注意的是,该模型配置为通过参数中的。

技术超强的网络安全平台 1648

HDU 1695:GCD 【容斥原理】

GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2474    Accepted Submission(s): 902   Problem Description Given 5 integers: a, b, c, d, ...

Sean 251

Coze智能体实战:接口需求分析和接口调试

AI智能体的需求:能根据接口文档提取接口信息以及设计接口测试点,并进行接口调试返回接口测试结果。

十二测试录 282

理想L9高通QAM8797座舱域控制器全拆解|全网独家复现 硬件架构升级、电源散热优化、多屏低延迟交互、车机系统赋能高端智能座舱落地

随着智能汽车向舱驾一体、全域智能化、多模交互方向迭代,传统单一功能座舱芯片已无法满足多屏高刷渲染、全车AI语音、车内视觉感知、高速车载通信的叠加算力需求。2026款全新理想L9作为旗舰级智能SUV,全面搭载高通新一代旗舰座舱域控制器QAM8797,搭配自研马赫M100 AI芯片、国产车规主控芯片,构建起高性能、高可靠、低延迟的车载中央计算平台。

getusushu的博客 376

GCD HDU - 1695 (容斥原理 + 欧拉函数)

Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. GCD(x, y) means the greatest common divisor of x and y. Since the number of choices may be very large, you're...

日月 332

AutosarMCAL开发——基于TC3x系列时钟系统浅析

本文为博主个人学习总结记录,如有不正,欢迎指正。

qq_45583706的博客 888

hdu 1695 GCD 欧拉函数+容斥 ||莫比乌斯反演

题意:给定a,b,c,d,k             x属于[1 , c],y属于[1 , d],求满足gcd(x,y)=k的对数。其中和算相同。 思路:不妨设c             那么假如yc/k,就只能从[ c/k+1 , d ]枚举,然后利用容斥。详见代码: /*******************************************************

AC_kereo的专栏 1638

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

HDU 1695 GCD(莫比乌斯反演,入门)

题目链接 题意:从区间[a,b]选择一个x,从区间[c,d]选择一个数y,使得gcd(x,y)==k 的方案数。 莫比乌斯反演学习资料 1,文库2,百科莫比乌斯反演学习 纯属个人理解,错误之处还望指正。莫比乌斯反演就是两个函数之间的关系,感觉类似函数中的反函数,莫比乌斯反演是数论中一个比较重要的公式,用于简化加速计算。 公式是: F(n)=∑d|nf(d)⇔f(n

qwesde 1813

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

[HDU1695]GCD(莫比乌斯反演)

夹起干花做的书签 和你一起骑上扔在角落的自行车 到我们快要忘记的堆满回忆的地方去

zyf2000 1064

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

莫比乌斯反演 (HDU 1695 ( GCD ))

莫比乌斯反演 (HDU 1695 ( GCD )) 声明:本文思路来自大佬 HDU 1695 题意: 这就需要用到莫比乌斯反演 什么是莫比乌斯反演? 个人理解: 简单来说,就是给出一个函数 F(n),然后再由F(n)定义一个函数G(n);然后已知G(n)求 F(n),就可以通过反演由G(n)反向得到F(n)。 就是根据已知的给反推回去。 我们先来看一个函数 这里 d∣n 的意思是d能整除n,也...

TA很酷的博客 765

HDU 1695 数论 容斥 欧拉函数 || 莫比乌斯反演

题目链接思路: 想了两个小时才想出容斥的思路….(真是太弱了AC之后搜题解发现是一个莫比乌斯的入门题,准备最近抽时间学习一下AC之后再来补上莫比乌斯的思路(占坑(更新见下容斥: 此题可以等价为: 从【1,n】中选出一个 X 从【1,m】中选出一个 Y 问有多少对不重复的 X,Y 满足 GCD(X,Y) == K?首先 我们可以从上述问题中提取出以下条件: 1 .1<=X<=n 1 <=

新熊君的博客 898

HDU - GCD(欧拉+容斥|莫比乌斯反演)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description Given 5 integers: a, b, c, d, k, you're to fin...

ityanger的技术栈 2852

hdu1695 gcd 莫比乌斯反演

传送门 题意:从1-m中选取x,1-n中选取y,使得gcd(x,y)=k,求选取方法数 思路:利用莫比乌斯反演,题目等价于从1-m/k中选取x,1-n/k中选取y,使得gcd(x,y)=1,求选取方法数,我们设 f(k)=使gcd(x,y)等于k的选取数 F(k)=使gcd(x,y)等于k的倍数的选取数 我们可以容易得出F(x)=(m/x)*(n/x) 根据莫比乌斯反演公式f(k)=∑

竹丙丙丙丙 518

HDU 1695 GCD 莫比乌斯反演

题意: 求【1,b】和【1,d】两个区间内gcd为k的数对的数量,其中(x,y)和(y,x)看作同一数对。 题解: 莫比乌斯反演入门题。 基本套路,设f(k)和g(k),g(k)很容易求,再通过莫比乌斯反演求f(k)。 我的另一篇博客中莫比乌斯反演的过程与这道题类似,且已经写得很详细了。 最后可得式子(方便起见,不妨令b<=d,不满足则交换两者值,显然不影响结果) 线性筛预...

qq_38515845的博客 280

莫比乌斯反演简单题

莫比乌斯函数这里简述一下莫比乌斯函数: 若d=1 那么μ(d)=1 若d=p1p2…pr (r个不同质数,且次数都为一)μ(d)=(-1)^r 其余 μ(d)=0 莫比乌斯反演的性质性质一:(莫比乌斯反演公式)f(n)=∑(d|n)μ(d)F(n/d)f(n) = \sum(d|n) {\mu(d)F(n/d)} 性质二:μ(n)是积性函数性质三:设f是算术函数,它的和函数F(n)=

Never say never 3669

HDU 1695 GCD (莫比乌斯反演)

大番茄番茄茄 Get lucky in life~ 莫比乌斯反演入门 _proto_ 莫比乌斯反演的学习(HDU1695) peng-ym 莫比乌斯反演 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e5+7; int mu[maxn]; bool che...

skyline的分享专栏 144

莫比乌斯反演+例题

问题引入: 添加链接描述 给定N和M和D,求满足1<=x<=N,1<=y<=M且gcd(x,y)=D的点对(x,y)的个数 1<=N,M<=1000000 莫比乌斯函数 μ μ(n) = 1 , n=1 μ(n) = (-1)k, n=p1 * p2 * … * Pk (x有奇数个质因子时为-1,x有偶数个质因子时为1) μ(n) = 0 其他情况(x存在平方因子) 莫比乌斯线性筛: int prime[MAXN],prime_tot; bool prime_tag[

qq_35975367的博客 1528

I - GCD(莫比乌斯反演欧拉函数,HDU1695)

I - GCD(莫比乌斯反演/欧拉函数,HDU1695) Given 5 integers: a, b, c, d, k, you’re to find x in a…b, y in c…d that GCD(x, y) = k. GCD(x, y) means the greatest common divisor of x and y....

dengyan1183的博客 326

HDU-1695 莫比乌斯反演

这里学习一下莫比乌斯反演 翻看了很多书,发现莫比乌斯反演,准确来说不是一种固有的公式,而是一种法则。 我们定义F(n),为f(d)的和函数,而定义f(n)为某儿算术函数。 反演公式1:反演n的因子时 废话不用多说,直接引入题目: HDU-1695-GCD 给出a,b,c,d,k, 问[a,b]和[c,d]区间内部...

114
上一篇: GCD Again HDU 1787(欧拉函数水题)
下一篇: Coprime HDU3388(容斥原理+二分查找)
Guuuuuu老师儿
博客等级 码龄9年 259粉丝 718原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值