首页 > 其他分享 >洛谷P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题

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

时间:2024-07-23 21:18:31浏览次数:7  
标签:count 满足条件 洛谷 NOIP2001 公倍数 60 int 最大公约数

[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,符合示例中的期望结果。

标签:count,满足条件,洛谷,NOIP2001,公倍数,60,int,最大公约数
From: https://www.cnblogs.com/Tomorrowland/p/18319655

相关文章

  • [NOIP2008 提高组] 笨小猴(洛谷题号P1125)
    [NOIP2008提高组]笨小猴题目描述笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的......
  • 洛谷P10693
    洛谷P10693好奇怪的题目编号题面\(n\)个人,\(2n\)个座位,每个人都有心仪的座位,如\(i\)心仪的座位为\(a_i\)(可重复),设计师设计让他们坐在自己编号的位置上,即\(i\)做到\(i\),每个人只可以做\(a_i\)或\(i\),最多多少个人坐到心仪的座位。思路提取input11213453799111112......
  • 洛谷算法题
    目录数字反转迪杰斯特拉算法背包问题字符串排序P1192台阶问题P1111修复公路炸铁路问题计数问题......
  • 洛谷P1331 海战
    一、题目题目背景在峰会期间,武装部队得处于高度戒备。警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机。此外,巡洋船只和舰队将被派去保护海岸线。不幸的是,因为种种原因,国防海军部仅有很少的几位军官能指挥大型海战。因此,他们培养了一些新海军指挥官。军官们......
  • 2024 洛谷月赛(柒)
    月赛GGrun%%%T1在相思树下I签到题QWQ,找规律易得。证明未知每次一定会删掉一半的数,所以第\(i\)次操作都会提供一个\(1<<i-1\)的贡献。这个贡献就是下一次会往后跳多少个位置。假如一开始确定留下的是第一个,那删偶数不会有影响,而删奇数需要往后跳。code#include<bit......
  • 洛谷 求m区间内的最小值
    原题p1440题目描述一个含有 ......
  • 洛谷 P1162 填涂颜色题解
    题目链接填涂颜色题目描述由数字\(0\)组成的方阵中,有一任意形状的由数字\(1\)构成的闭合圈。现要求把闭合圈内的所有空间都填写成\(2\)。例如:\(6\times6\)的方阵(\(n=6\)),涂色前和涂色后的方阵如下:如果从某个\(0\)出发,只向上下左右\(4\)个方向移动且仅经过其他\(0\)......
  • 洛谷B3626(跳跃机器人)解析
     这道题的网址洛谷B3626请速览一遍原题当然,咱们来进行题面关键信息提取 1.机器人从第1个格子出发;2.设机器人目前所在格子的编号为x,则它能够跳到格子的编号可能是x,x+1或2x,也就是说,新跳到格子的编号,可能是比原来格子编号少1或多1,或是其2倍;3.不允许跳出界,举个简单的例子......
  • 洛谷 T480715 true
    的真实值是,的真是值是,那么的真是值便是。ACCODE:#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;intmain(){ inta,b; cin>>a>>b; inttrue_a=a/10,true_b=b*10; inttrue_c=10000-true_a-true_b; cout<<true_a<<''&......
  • python-最小公倍数(PythonTip)
    [题目描述]编写一个程序,找出能被从1到给定数字n(包括n)的所有数字整除的最小正数(即最小公倍数)。定义函数smallest_multiple()的函数,参数为n。在函数内,返回能被从1到给定数字n(包括n)的所有数字整除而无余数的最小正数。示例输入:5示例输出:60比如,对于输入5,最小公倍数是60,因为......