洛谷千题详解 | P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题【C++语言】

news2024/12/29 10:27:16

博主主页:Yu·仙笙

专栏地址:洛谷千题详解

目录

题目描述

输入格式

输出格式

输入输出样例

解析:

C++源码:

C++源码2:

C++源码3:


-------------------------------------------------------------------------------------------------------------------------------- 

 --------------------------------------------------------------------------------------------------------------------------------

题目描述

输入两个正整数x0​,y0​,求出满足下列条件的 P, Q 的个数:

  1. P,Q 是正整数。

  2. 要求 P, Q 以x0​ 为最大公约数,以 y0​ 为最小公倍数。

试求:满足条件的所有可能的 P, Q 的个数。

 --------------------------------------------------------------------------------------------------------------------------------

输入格式

一行两个正整数x0​,y0​。

 --------------------------------------------------------------------------------------------------------------------------------

输出格式

一行一个数,表示求出满足条件的 P, Q 的个数。

 --------------------------------------------------------------------------------------------------------------------------------

输入输出样例

输入 #1复制

3 60

输出 #1复制

4

 --------------------------------------------------------------------------------------------------------------------------------

解析:

upd on 2020/06/12:修改了部分解释不够清楚和有歧义的地方。
upd on 2022/07/21:添加了 Latex。

前置知识

  • 最大公约数(即 \gcdgcd) 和最小公倍数(即 \operatorname{lcm}lcm)的求法。

该题的关键点在于,两个数的积等于它们最大公约数和它们最小公倍数的积。公式表示为 a\times b=\gcd(a,b) \times \operatorname{lcm}(a,b)a×b=gcd(a,b)×lcm(a,b)。设作为答案的两个数为 xx 和 yy,我们要使它们同时满足以下三个条件,并统计这样的 xx 和 yy 的个数(P,QP,Q 含义见题目描述):

  • x \times y=P \times Qx×y=P×Q
  • \gcd(x,y)=Pgcd(x,y)=P
  • \operatorname{lcm}(x,y)=Qlcm(x,y)=Q

我们可以枚举 xx,判断是否存在满足条件 11 的整数 yy(即,xx 能否被 P,QP,Q 的积整除)。满足第一个条件后,再分别判断当前的 x,yx,y 是否能够同时满足另外两个条件即可。显然,这种做法会超时。

考虑优化这个程序。我们其实并不需要枚举两次,因为对于不同的 x,yx,y ,交换它们的值一定可以得到另一组与之对应的解。因此,从 11 到 \sqrt{P\times Q}P×Q​ 枚举一遍,每发现一组答案就将 ansans 的值加上 22 即可。

一组 x,yx,y 有对应解时有条件:x,yx,y 的值不同。如果它们相同,交换后并不能得到与之对应的另一组数。当 x=yx=y 时,易得 x=y=\gcd(x,y)=\operatorname{lcm}(x,y)x=y=gcd(x,y)=lcm(x,y)。 所以要对此进行特判,若 P,QP,Q 相等,这种情况就存在, ansans 里要减去 11。

一些代码实现技巧:

  • c++ 里有一个自带的求 \gcdgcd 的函数叫 __gcd 。upd:现在 NOIP 已经可以使用了。

  • 当积相同且 \gcdgcd 相同时,\operatorname{lcm}lcm 也一定相同,因此只需判断是否满足一、二两个条件即可。

  -------------------------------------------------------------------------------------------------------------------------------

C++源码:

#include<iostream>
using namespace std;
int ans=0;//ans是情况数量。 
int d(int a,int b){//求最大公约数函数。a,b是两个待求最大公约数的数,不是题里的x0y0。 
	if(a<b) swap(a,b);//确保a>b,为下一步除法做准备
	if(a%b==0) return b;//如果a/b余0,那么b就是最大公约数。比如10和5, 10/5余0,5就是最大公约数 
	else return d(b,a%b);//辗转相除法求最大公因数(其实交换ab那一步没必要,小除以大余小本身,到这里自然就换过来了,比如3和15,3/15余3,到这里就变成了15和3,嗯) 
}
int x(int a,int b){//最小公倍数 
	return (a*b/d(a,b));//最大公因数和最小公倍数的乘积等于原两个数的乘积。所以这两个数的乘积除以最大公因数等于最小公倍数。 
}
int main(){
	int x0,y0;//这才是x0y0. 
	cin>>x0>>y0;//(这里用个搜索就行了) 
	for(int i=x0;i<=y0;i++){//a一定在它的最大公因数和最小公倍数之间,这很明显 
		int j=x0*y0/i;//最大公因数和最小公倍数的乘积等于原两个数的乘积。老道理 。b就这样算 
		if(d(i,j)==x0&&x(i,j)==y0)// 如果ab(ij)的最大公因数,最小公倍数符合x0y0 
			ans++;//计数 
	}
	cout<<ans<<endl;
	return 0;
}	

  -------------------------------------------------------------------------------------------------------------------------------

C++源码2:

#include <bits/stdc++.h>
using namespace std;
long long x,y;
inline long long gcd(long long x,long long y)
{
	if(y==0) return x;
	return gcd(y,x%y);
}
int main()
{
	cin>>x>>y;
	long long ans=0;
	for(long long i=1;i<=sqrt(x*y);i++)
	{
		if(x*y%i==0&&gcd(i,x*y/i)==x) ans++;
	}
	ans*=2;
  	if(x==y) ans--;
   	cout<<ans;
	return 0;
}

  -------------------------------------------------------------------------------------------------------------------------------

C++源码3:

#include <iostream>
int main()
{
    int x, y;
    std::cin >> x >> y;
    if (y % x != 0)
        std::cout << 0;
    else
    {
        int quotient = y / x;
        int count = 0;        //统计素因数的个数
        int currentFactor = 2; //用来试验整除性的因数
        while (quotient > 1) //等于1时标志着分解完毕
        {
            if (quotient % currentFactor == 0)
            {
                count++;
                while (quotient % currentFactor == 0)
                    quotient /= currentFactor;//若能整除就除到底
            }
            currentFactor++;
        }
        std::cout << (1 << count);//使用位运算来产生2的方幂
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/122256.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022博客之星年度总评选开始了

作者简介&#xff1a;陶然同学 专注于Java领域开发 熟练掌握Java、js等语言的“Hello World” CSDN原力计划作者、CSDN内容合伙人、Java领域优质作者、Java领域新星作者、51CTO专家、华为云专家、阿里云专家等 &#x1f3ac; 陶然同学&#x1f3a5; 由 陶然同学 原创&#…

Linux之SQL Server数据库安装

一、SQL Server简介 SQL Server 是一个关系数据库管理系统。它最初是由Microsoft Sybase 和Ashton-Tate三家公司共同开发的&#xff0c;于1988 年推出了第一个OS/2 版本。在Windows NT 推出后&#xff0c;Microsoft与Sybase 在SQL Server 的开发上就分道扬镳了&#xff0c;Micr…

密码学 公开密钥管理

PKU概念 Public Key Infrastructure PKI一般指公钥基础设施。 公钥基础设施是一个包括硬件、软件、人员、策略和规程的集合&#xff0c;用来实现基于公钥密码体制的密钥和证书的产生、管理、存储、分发和撤销等功能。 基于PKI的信任模型 如果一个个体假设CA 能够建立并维持一…

ASP.NET Core 3.1系列(21)——EFCore中的更新实体操作

1、前言 前面的博客已经介绍过EFCore中关于新增和删除实体的相关操作&#xff0c;本文开始介绍EFCore中的更新实体操作。与新增实体和删除实体相比&#xff0c;更新实体的操作略微有些复杂&#xff0c;如果在代码的写法上不多加注意&#xff0c;那就很有可能会在后台生成效率低…

利用空余时间成为“业余”的自动驾驶的开发者

作为一名开发者&#xff0c;我时常会阅读一些相关的技术杂志和周刊&#xff0c;了解一些近期比较热门的技术和事件&#xff0c;要说现在技术领域最有发展前景的方向之一&#xff0c;很多人会想到自动驾驶。但现在国内做自动驾驶平台的并不多&#xff0c;其中百度做得是相对比较…

【Web】浅谈Http的请求方式和数据请求格式ContentType

我本来Http的请求方式和数据请求格式是大家开发过程中都默认知道的事情&#xff0c;直到我发现我的前端竟然不知道表单请求的时候&#xff0c;我觉得我有必要跟大家一起来讨论一下这个话题了。有可能我的前端小伙伴在学习的时候一开始就入手现在比较流行的前端框架如Vue、React…

3dmax 建模插件 Rappa Tools 3 笔记

1功能概述&#xff1a; RappaTools3是一个高级工具箱&#xff0c;为在3ds Max中工作的艺术家提供了各种各样的工具。主要的重点是加快工作流程和减少点击量。它提供了各种各样的工具&#xff0c;从选择工具到渲染工具。它可以帮助您完成创建3D艺术作品的整个过程。 它带有3个…

C#,图像二值化(05)——全局阈值的联高自适应算法及其源代码

阈值的选择当然希望智能、简单一些。应该能应付一般的图片。 What is Binarization? Binarization is the process of transforming data features of any entity into vectors of binary numbers to make classifier algorithms more efficient. In a simple example, trans…

优思学院|怎么把DPMO/不良率换算成六西格玛水平?

如何计算西格玛水平&#xff1f; 为了更形像化地说明西格玛水平&#xff08;Sigma Level&#xff09;&#xff0c;我们设定一个场景作为例子&#xff0c;假设你是一家电力公司&#xff0c;你会如何评估你公司的质量水平呢&#xff1f;你可能会以电网供电时的正常运行时间来衡量…

知识付费海哥:知识变现三剑客

小时候看武侠戏&#xff0c;那些古代剑客&#xff0c;飞檐走壁&#xff0c;神出鬼没&#xff0c;行走江湖&#xff0c;行侠仗义&#xff0c;牛逼的很&#xff01;心里贼仰慕&#xff01; 记忆最深的&#xff0c;是剑客们稳、准、狠的绝技剑法&#xff0c;剑起头落&#xff0c;一…

python实现字幕雨效果实现

先看最终实现的效果图&#xff1a; 使用python实现以上字幕雨效果&#xff0c;用到的主要库是pygame&#xff1b; pygame不是内置模块&#xff0c;需要先安装一下&#xff1a; 安装pygame 安装方式推荐有很多种&#xff0c;推荐使用pip&#xff1b; pip 是 Python 的包安装程…

RabbitMQ 订阅模型-路由模式

订阅模型-路由模式&#xff0c;此时生产者发送消息时需要指定 RoutingKey&#xff0c;即路由 Key&#xff0c;Exchange 接收到消息时转发到与 RoutingKey 相匹配的队列中。 在 Direct 模型下&#xff1a; 队列与交换机绑定&#xff0c;不能任意绑定&#xff0c;而要指定一个 Ro…

线上贷款申请违约风险预测大数据模型

通过模型可以得出模型分类准确率&#xff0c;通过客户信用违约风险预测模型&#xff0c;可以实现多渠道预警&#xff0c;形成多角度观察、多方面分析、多渠道传递的工作局面。

Python每日一练 10——for循环

Python每日一练 10——for循环 文章目录Python每日一练 10——for循环一、for循环介绍二、实例一&#xff1a;等差数列前n项和三、实例二&#xff1a;计算阶乘四、实例三&#xff1a;拉马努金法计算圆周率五、实例四&#xff1a;百钱买百鸡一、for循环介绍 for循环一般用于循环…

前端_Vue_9.模板引用、组件基础

文章目录一、模板引用1.1. 访问模板引用1.2. v-for 中的模板引用1.3. 函数模板引用1.4. 组件上的 ref1.5. 小结二、组件基础 ⭐2.1. 定义一个组件2.2. 使用组件2.3. 传递props2.4. 监听事件2.5. 通过插槽&#xff08;slot&#xff09;来分配内容2.6. 动态组件2.7. DOM模板解析注…

go 库 Cobra 现代化的命令行框架

go 库 Cobra 现代化的命令行框架 文章目录go 库 Cobra 现代化的命令行框架1. 简介2. 主要功能3. 应用举例4. Cobra 安装5. 使用 Cobra 库创建命令5.1 创建 rootCmd5.2 创建 main.go5.3 添加命令5.4 编译并运行6. 特性6.1 使用标志6.2 非选项参数验证6.3 PreRun and PostRun Hoo…

手绘图说电子元器件-电声转换器件

电声转换器件包括能够将电信号转换为声音的扬声器、耳机、讯响器和蜂鸣器,能够将声音转换为电信号的传声器,能够进行电磁转换的磁头和具有压电效应的晶体等。 扬声器 扬声器俗称喇叭,是一种常用的电声转换器件,其基本作用是将电信号转换为声音,在收音机、录音机、电视机…

Linux | 套接字(socket)编程 | TCP协议讲解 | 通信模型搭建

文章目录TCP模型的特性TCP接口介绍TCP服务器套接字设置TCP客户端套接字设置TCP模型的特性 TCP是属于传输层协议的一种&#xff0c;上篇博客介绍了另一种传输层协议——UDP&#xff0c;关于它们之间的区别&#xff0c;这里再提一下 TCPUDP传输层协议传输层协议有连接无连接可靠…

Word控件Spire.Doc 【评论】教程(3):在C#、VB.NET中从Word文档中提取注释并保存在TXT文件中

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

[Leetcode] 合并两个有序数组、链表

1.合并两个有序数组 原地合并数组&#xff0c;即不使用额外的空间 --> 使用三个指针&#xff0c;从尾部往前处理 题目链接&#xff1a;https://leetcode.cn/problems/merge-sorted-array/ nums1 总长度 mn&#xff0c;自身长度m&#xff1b;nums2 自身长度n&#xff0c; 使…