题目名称:最大公约数和最小公倍数问题

来源:2001年NOIP普及组

链接

博客链接

题目链接

题目内容

题目描述

输入二个正整数\(x_0,y_0(2\leq x_0\leq100000,2\leq y_0\leq1000000)\),求出满足下列条件的\(P、Q\)的个数。

条件:

  1. \(P、Q\)是正整数
  2. 要求\(P、Q\)以\(x_0\)为最大公约数,以\(y_0\)为最小公倍数。

试求,满足条件的所有可能的两个正整数的个数。

格式

输入

\(2\)个正整数\(x_0\),\(y_0\)

输出

\(1\)个数,表示求出满足条件的\(P\),\(Q\)的个数

数据

样例

输入

  1. 3 60

输出

  1. 4

说明

\(P,Q\)有\(4\)种

  1. \(3,60\)
  2. \(15,12\)
  3. \(12,15\)
  4. \(60,3\)

数据范围

\(2\leq x_0\leq100000,2\leq y_0\leq1000000\)

题解

约定\(D=min(x_0,y_0),M=max(x_0,y_0)\)

情况1:

\(M \mod D\neq0\)

显然,无解。

情况2:

\(M \mod D=0\)

推一波

\[\because (P,Q)=D,[P,Q]=M\\
\therefore P\times Q=(P,Q)[P,Q]=D\times M\\
p=P\div D,q=Q\div D,prod=D\div M\\
\therefore p\times q=prod\&(p,q)=1\\
\]

当然,暴力枚举\(p\)就可以通过此题,时间复杂度\(O(\sqrt{prod}\times \log(\sqrt{prod}))\)。

但是这次笔者要将一个更优的解法。

由推出来的式子可得,我们就要求有多少对\(prod\)的因数互质。

现将\(prod\)分解质因子得到\(prod\)有\(n\)种质因子。

对于质因子\(d\),要么只是\(p\)的质因子,要么只是\(q\)的质因子(如果\(p\)和\(q\)同时拥有这个质因子\(d\),那么\((p,q)\neq 1\)),并且\(d\)至少要是其中一个的因数(否则\(p\times q\neq prod\))。

所以说其中每种质因子都有两种可能,则答案是\(2^n\)。

时间复杂度\(O(玄学)\),(最坏\(O(\sqrt{prod})\),最好\(O(\log(prod))\))

  1. //C++
  2. #include<bits/locale_facets.h>
  3. #include<stdio.h>
  4. #define forto(name,i,d,u) for(name i=d;i<=u;i++)
  5. inline void output(long long o);
  6. inline long long input();
  7. int main()
  8. {
  9. short numeral=0;
  10. int x=input(),y=input();
  11. if(y%x)return putchar('0'),0;
  12. y/=x;
  13. forto(int,i,2,y/i)
  14. if(!(y%i))
  15. {
  16. numeral++;
  17. while(!(y%i))y/=i;
  18. }
  19. if(y>1)numeral++;
  20. output(1<<numeral);
  21. return 0;
  22. }
  23. inline void output(long long o)
  24. {
  25. if(o<0)putchar('-'),o=-o;
  26. if(o>=10)output(o/10);
  27. putchar(o%10^'0');
  28. }
  29. inline long long input()
  30. {
  31. bool minus=false;
  32. char now=getchar();
  33. long long i=0;
  34. for(;!isdigit(now);now=getchar())
  35. if(now=='-')minus=!minus;
  36. for(;isdigit(now);now=getchar())i=(i<<3)+(i<<1)+(now^'0');
  37. return minus?-i:i;
  38. }
  1. //pascal
  2. var
  3. numeral:1..30;
  4. x:2..100000;
  5. i,y:1..1000000;
  6. begin
  7. readln(x,y);
  8. if y mod x>0 then
  9. begin
  10. write('0');
  11. halt;
  12. end;
  13. y:=y div x;
  14. i:=2;
  15. while i<=y div i do
  16. begin
  17. if y mod i=0 then
  18. begin
  19. inc(numeral);
  20. while y mod i=0 do y:=y div i;
  21. end;
  22. inc(i);
  23. end;
  24. if y>1 then inc(numeral);
  25. write(1 shl numeral);
  26. end.

[NOIP普及组2001]最大公约数和最小公倍数问题的更多相关文章

  1. 【NOIP2001普及组】最大公约数和最小公倍数问题

    P1029 最大公约数和最小公倍数问题 最大公约数用辗转相除法: 最小公倍数:两个数的乘积=他们的最大公约数*最小公倍数,既然两个数的乘积及其最大公约数已知,那么最小公倍数也可以求了. #includ ...

  2. 2321. 【NOIP普及组T1】方程

    2321. [NOIP普及组T1]方程 时间限制: 1000 ms  空间限制: 262144 KB 题目描述

  3. [NOIP普及组2011]装箱问题

    目录 链接 博客链接 题目链接 题目内容 题目描述 格式 输入 输出 样例 输入 输出 前缀知识 题解 题目名称:装箱问题 来源:2011年NOIP普及组 链接 博客链接 CSDN 洛谷博客 题目链接 ...

  4. 2016.8.15上午纪中初中部NOIP普及组比赛

    2016.8.15上午纪中初中部NOIP普及组比赛 链接:https://jzoj.net/junior/#contest/home/1333 这次比赛不怎么好,因为这套题目我并不是很擅长. 可同学们 ...

  5. 2016.9.15初中部上午NOIP普及组比赛总结

    2016.9.15初中部上午NOIP普及组比赛总结 2016.09.15[初中部 NOIP普及组 ]模拟赛 又翻车了!表示时超和空超很可恨! 进度 比赛:AC+0+0+20=120 改题:AC+80+ ...

  6. 2016.9.10初中部上午NOIP普及组比赛总结

    2016.9.10初中部上午NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1340 好不爽!翻车了!不过排名差不多在中间偏上一点, 还好不是 ...

  7. 2016.9.3初中部上午NOIP普及组比赛总结

    2016.9.3初中部上午NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1339 这次真爽,拿了个第四!(我还被班主任叫过去1小时呢!) 进 ...

  8. 2016.8.19上午初中部NOIP普及组比赛总结

    2016.8.19上午初中部NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1338 这次总结发得有点晚啊!我在这里解释一下, 因为浏览器的问 ...

  9. 2016.8.18上午纪中初中部NOIP普及组比赛

    2016.8.18上午纪中初中部NOIP普及组比赛 链接:https://jzoj.net/junior/#contest/home/1336 翻!车!啦!好吧,那是因为大神归来. 进度: 比赛:AC ...

随机推荐

  1. geometry_msgs.msg.PoseStamped 代码示例

    https://programtalk.com/python-examples/geometry_msgs.msg.PoseStamped/

  2. 【python代码】linux 登陆网关

    #!/usr/bin/env python import urllib2 url="http://10.3.8.211" data="DDDDD=2010111222&a ...

  3. 如何计算一个C/C++程序运行时间

    前两天要计算一个用C++实现的算法运行时间,就用了clock()这个函数.程序大体上如下: clock_t start,end; start = clock(); /*my code*/ end = ...

  4. OpenGL ES: (1) OpenGL ES的由来 (转)

    1. 电脑是做什么用的? 电脑又被称为计算机,那么最重要的工作就是计算.看过三体的同学都知道, 电脑中有无数纳米级别的计算单元,通过 0 和 1 的转换,完成加减乘除的操作. 2. 是什么使电脑工作? ...

  5. nineoldandroids开源库

    Android3.0 推出AnimationAPI ,使用起来比较方便,但是不能再3.0以下版本中使用.nineoldandroids开源库可以在任意版本上使用,官网地址:http://nineold ...

  6. 【转载】 一文看懂深度学习新王者「AutoML」:是什么、怎么用、未来如何发展?

    原文地址: http://www.sohu.com/a/249973402_610300 原作:George Seif 夏乙 安妮 编译整理 ============================= ...

  7. Java中声明泛型方法

    泛型是什么意思在这就不多说了,而Java中泛型类的定义也比较简单,例如:public class Test<T>{}.这样就定义了一个泛型类Test,在实例化该类时,必须指明泛型T的具体类 ...

  8. React之简介

    官网链接React 用于构建用户界面的 JavaScript 库 特色 声明式: React 使创建交互式 UI 变得轻而易举.为你应用的每一个状态设计简洁的视图,当数据改变时 React 能有效地更 ...

  9. 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_03-Eureka注册中心-搭建Eureka高可用环境

    1.3.2.2 高可用环境搭建 Eureka Server 高可用环境需要部署两个Eureka server,它们互相向对方注册.如果在本机启动两个Eureka需要 注意两个Eureka Server ...

  10. LODOP获取打印状态码和时间列表

    之前有博文介绍获取打印状态码和打印状态码的含义,相关博文:LODOP获取打印机状态码和状态码含义测试.此外 ,也有获取状态码及其变化的方法,可以获取打印状态码的列表,列表包含每个状态和每个状态的时间. ...