[NOIP2001 普及组] 最大公约数和最小公倍数问题

题目描述

洛谷题目链接:https://www.luogu.com.cn/problem/P1029

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

  1. P,Q 是正整数。

  2. 要求 P, Q 以x 为最大公约数,以 y 为最小公倍数。

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

输入格式

一行两个正整数 x, y。

输出格式

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

样例 #1

样例输入 #1

3 60

样例输出 #1

4

提示

P,Q 有 4 种:

  1. 3, 60。
  2. 15, 12。
  3. 12, 15。
  4. 60, 3。

对于 100% 的数据,2<=x,y<=10^5.

【题目来源】

NOIP 2001 普及组第二题

思路:

我们可以枚举最大公倍数y的所有因子,然后检查每一对因子的最小公倍数是不是x即可。最后算出所有的对数。

这段代码是用来解决题目中要求的问题:找出满足条件的 ( P, Q ) 的个数,使得它们的最大公约数是 ( x ),最小公倍数是 ( y )。

AC代码如下:

#include<iostream>
using namespace std;
int gcd(int x, int y)
{
return y ? gcd(y, x % y) : x;
}
int main()
{
int x, y;
int count = 0;
cin >> x >> y;
for (int k = 1; k <= y / k; k++) {
if (y % k == 0) {
if (gcd(k, y / k * x) == x) count++;
if (k != y / k) {
if (gcd(y / k , k * x) == x) count++;
}
}
}
cout << count;
return 0;
}

代码解析如下:

  1. 函数 gcd(int x, int y)

    • 这是一个递归函数,用来计算两个整数 ( x ) 和 ( y ) 的最大公约数(GCD)。
    • 如果 ( y ) 不为0,则递归地调用自身,传入 ( y ) 和 ( x \mod y )。
    • 当 ( y ) 为0时,返回 ( x ),即此时的 ( x ) 就是最大公约数。
  2. 主函数 main()

    • 首先声明了几个变量:x, y, p, q, count,其中 count 用来统计满足条件的 ( P, Q ) 的个数。
    • 输入读取了两个正整数 ( x ) 和 ( y )。
  3. 循环部分

    • for (int k = 1; k <= y / k; k++):从 ( k = 1 ) 开始,遍历到 ( k ) 小于等于 ( sqrt(y) )。
    • if (y % k == 0):检查 ( k ) 是否是 ( y ) 的因子。
    • 如果是 ( y ) 的因子,说明 ( y ) 可以分解为 (y=k*(y/k))。
    • if (gcd(k, y / k * x) == x) count++if (gcd(y / k, k * x) == x) count++
      • 分别检查 (k,y/k*x)与(y/k,k/x) 这两对是否满足条件。
      • 即检查它们的最大公约数是否等于 ( x )。
  4. 输出部分

    • 输出 count,即满足条件的 ( P, Q ) 的个数。

这段代码利用了数学上的性质,通过分解 ( y ) 的因子来检查每一对 ( P, Q ) 是否满足条件,使用了最大公约数函数 gcd 来验证条件。这种方法相比直接遍历所有可能的 ( P, Q ) 组合更加高效。

示例解析

对于输入 3 60,程序会计算:

  • ( x = 3 ),( y= 60 )。
  • 遍历 ( k ) 从 1 到 ( sqrt(60)):
    • 找到 ( k = 1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30 ) 是 ( 60 ) 的因子。
    • 对每个 ( k ),检查 ( (k, 60/k 3) ) 和 ( (60/k, k* 3) ) 是否满足条件。
    • 统计满足条件的 ( P, Q ) 的个数。

输出结果为 4,符合示例中的期望结果。

洛谷P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题的更多相关文章

  1. 洛谷P1049 [NOIP2001 普及组] 装箱问题

    本题就是一个简单的01背包问题   1.因为每个物品只能选一次,而且要使箱子的剩余空间为最小.所以可以确定属性为 MAX 2.由于是从n个物品里面选i个物品 那么就是选出的i个物品的空间总和要尽可能的 ...

  2. 动态规划 洛谷P1048 [NOIP2005 普及组] 采药

    洛谷P1048 [NOIP2005 普及组] 采药 洛谷的一个谱架-的题目,考的是01背包问题,接下来分享一下我的题解代码. AC通过图: 我的代码: 1 //动态规划 洛谷P1048 [NOIP20 ...

  3. 求最长子序列(非连续)的STL方法 - 洛谷P1020 [NOIP1999 普及组] 导弹拦截

    先给出例题:P1020 [NOIP1999 普及组] 导弹拦截 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 大佬题解:P1020 [NOIP1999 普及组] 导弹拦截 - 洛谷 ...

  4. 洛谷 P1045 & [NOIP2003普及组] 麦森数

    题目链接 https://www.luogu.org/problemnew/show/P1045 题目大意 本题目的主要意思就是给定一个p,求2p-1的位数和后500位数. 解题思路 首先看一下数据范 ...

  5. 洛谷 P1025 & [NOIP2001提高组] 数的划分(搜索剪枝)

    题目链接 https://www.luogu.org/problemnew/show/P1025 解题思路 一道简单的dfs题,但是需要剪枝,否则会TLE. 我们用dfs(a,u,num)来表示上一个 ...

  6. 洛谷P1077 [NOIP2012普及组]摆花 [2017年四月计划 动态规划14]

    P1077 摆花 题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能 ...

  7. 洛谷——P1980 [NOIP2013 普及组] 计数问题

    题目描述 试计算在区间 11 到 nn的所有整数中,数字x(0 ≤ x ≤ 9)x(0≤x≤9)共出现了多少次?例如,在 11到1111中,即在 1,2,3,4,5,6,7,8,9,10,111,2, ...

  8. 洛谷 1067 NOIP2009 普及组 多项式输出

    [题解] 一道简单的模拟题.需要判一些特殊情况:第一项的正号不用输出,x的一次项不用输出指数,系数为0的项不用输出等等,稍微细心一下就好. #include<cstdio> #includ ...

  9. [洛谷P1062/NOIP2006普及组] 数列

    首先题面是这样的: 给定一个正整数 k(3≤k≤15) ,把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当 k=3 时,这个序列是: 1,3,4,9,10,12,13,- ...

  10. [洛谷P1095]NOIP2007 普及组T3 守望者的逃离

    问题描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会 ...

随机推荐

  1. pwn杂项之linux命令执行

    通常pwn题目,时常会考到对Linux命令的一些使用,比如当cat被禁用的时候,可以使用tac,或者别的命令代替 下面是buu上的应该题目,考察的就是对liunx命令的理解,以及对程序的分析. 题目地 ...

  2. golang 接口动态派发性能问题

    测试代码 package main type Duck interface { Quack() } type Cat struct { Name string } //go:noinline func ...

  3. 查看CentOS版本的方法

    1.以下命令对于Linux发行版是通用的: root@MyMail ~ # uname Linux root@MyMail ~ # uname -r 2.6.18-164.el5 [root@loca ...

  4. 7.16考试总结(NOIP模拟17)[世界线·时间机器·weight]

    车如流水马如龙,花月正春风 前言 其实,一开始 T1 是看错了题的,我以为是无向图来着,就想直接搞到每一个联通块的完全图,然后减去总边数就好了. 发现错误之后,码了个暴力,想得 40pts 来着,没想 ...

  5. 16位简单ASM题的记录——[HGAME 2022 week1]easyasm

    第一次遇见16位,和纯看汇编的题目,记录一下 DIE 16位,IDA用32位或者64位都可以打开 IDA 主要汇编部分 seg003:0000 ; =============== S U B R O ...

  6. C语言-使用malloc导致的奔溃问题

    在使用malloc.memset.free的过程中,出现了程序奔溃,大致现象如下. 程序的实现大致如下: #include <stdio.h> #include <stdlib.h& ...

  7. 执行nodejs 内置fs模块

        执行方式1:                 在 cmd 中 任意文件夹路径下输入 node 回车                 C:\Users\32991>node         ...

  8. set数据类型

                SET 数据类型             是一个类似于 数组 的数据类型             特点 : 不接受重复的相同的数据                    同样的 ...

  9. ConfigurationManager 读取的不是最新值

    用 ConfigurationManager 修改配置后,ConfigurationManager 读取的不是最新值. 解决方法: 第一种: ConfigurationManager.RefreshS ...

  10. 使用 eBPF 在云中实现网络可观测性

    可观测性是一种了解和解释应用当前状态的能力,也是一种知道何时出现问题的方法.随着在 Kubernetes 和 OpenShift 上以微服务形式进行云部署的应用程序越来越多,可观察性受到了广泛关注.许 ...