GCDLCM

题目链接(点击)

题目描述

In FZU ACM team, BroterJ and Silchen are good friends, and they often play some interesting games.
One day they play a game about GCD and LCM. firstly BrotherJ writes an integer A and Silchen writes an integer B on the paper. Then BrotherJ gives Silchen an integer X. Silchen will win if he can find two integers Y1 and Y2 that satisfy the following conditions:
• GCD(X, Y1) = A
• LCM(X, Y2) = B
• Fuction GCD(X, Y ) means greatest common divisor between X and Y .
• Fuction LCM(X, Y ) means lowest common multiple between X and Y .
BrotherJ loves Silchen so much that he wants Silchen to win the game. Now he wants to calculate how many number of X he can give to Silchen.

输入

Input is given from Standard Input in the following format:
A B
Constraints
1 ≤ A, B ≤ 1018
Both A and B are integers.

输出

Print one integer denotes the number of X.

样例输入

3 12

样例输出

3

题意:

给出A和B要求找到x、y1和y2满足条件的x个数:(y1和y2任意取)

gcd (x,y1) = A

gcd (x,y2) = B

例如 当A=3  B=12时

当x=3的时候满足:gcd(3,3)= 3并且 lcm(3,12)

当x=6的时候满足:gcd(6,3)= 3并且 lcm(6,12)

当x=6的时候满足:gcd(12,3)= 3并且 lcm(12,3)

只有上面三种x符合条件 所以结果是 3

思路:

可以列出表达式或者根据上面规律可以推出:

满足条件的 x 一定是A的倍数 并且是B的因子 也就是求B/A的因子个数(前提是A是B的倍数)

之前解决这类问题都是素数打表+唯一分解定理解决 可是这个题的数范围太大 打表基本不可能实现

就引入下面代码中的方法

米勒_拉宾素数检验:

具体推导过程和原理这个博客写的很好:

感谢:https://blog.csdn.net/qq_40564464/article/details/81774129

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod=1e9+7;
LL qmul_mod(LL m,LL q,LL mod) ///快速乘 保证高精度 避免快速幂相乘爆LL
{LL ans=0;while(q){if(q%2){ans=(ans+m)%mod;}m=(m*2)%mod;q/=2;}return ans;
}
LL qpow_mod(LL m,LL q,LL mod) ///快速幂+取模
{LL ans=1;while(q){if(q%2){ans=qmul_mod(ans,m,mod);}m=qmul_mod(m,m,mod);q/=2;}return ans;
}
///2 7 61
bool Miller_Rabbin(LL x) ///米勒拉宾素数检验算法 博客里面给的是用2、3、5、7、11正确性很高 但我
{                            ///改了那个之后会Wa没办法 可用这个就过了 顿时…if(x==2||x==7||x==61) return true; //肯定是素数if(x%2==0||x%7==0||x%61==0) return false; //素数倍数if(qpow_mod(2,x-1,x)==1&&qpow_mod(7,x-1,x)==1&&qpow_mod(61,x-1,x)==1) ///均满足费马小return true;                      ///定理说明一定是素数(从推荐的那个博客中有讲原因)elsereturn false;
}
int main()
{LL A,B;scanf("%lld%lld",&A,&B);if(B%A==0){B/=A;LL ans=1;for(int i=2;i<=1000000;i++){ ///这种方法不需要素数打表 只要跑一边for循环就可以把小于LL Count=0;                  ///1e6的因子除去 还挺好while(B%i==0){Count++;B/=i;}ans=ans*(Count+1)%mod;}if(B>1){ ///下面可能有点难理解 if(Miller_Rabbin(B)){  ///被上面的循环筛过一次之后 剩下的如果B>1 剩下的肯定是由素ans=ans*2%mod;    ///数构成的数 可能是一个大素数 也可能是两个素数}                  ///而不可能是三个素数构成 因为三个>1e6的数相乘肯定会超1e18 else{LL t=sqrt(B);if(t*t==B) ///是两个相同的素数构成的ans=ans*3%mod; else ///两个不同的素数构成的ans=ans*4%mod;}}printf("%lld\n",ans);}elseprintf("0\n");return 0;
}

GCDLCM 【米勒_拉宾素数检验 (判断大素数)】相关推荐

  1. Miller_Rabbin算法判断大素数,Pollard_rho算法进行质因素分解

    Miller-rabin算法是一个用来快速判断一个正整数是否为素数的算法.它利用了费马小定理,即:如果p是质数,且a,p互质,那么a^(p-1) mod p恒等于1.也就是对于所有小于p的正整数a来说 ...

  2. [数论] Miller_Rabbin算法判断大素数,Pollard_rho算法进行质因素分解

    讲解转载于:http://www.cnblogs.com/rainydays/archive/2011/09/01/2162049.html   http://blog.sina.com.cn/s/b ...

  3. 素数的判断,以及素数的遍历

    去除偶数之后 从3到X-1,每次加 2 public static void main(String[] args) {// TODO Auto-generated method stubScanne ...

  4. 数论 判断素数:普通素数判别 线性筛 二次筛法求素数 米勒拉宾素数检验

    普通的素数判断法 当我们要判断一个数字是否是素数的时候,往往会直接看这个数字模1到这个数字的根号,看有没有等于零的,从而判断这个数字是不是素数,这样做的时间复杂度为O(sqrt(n)) bool is ...

  5. java生成大素数_用BigInteger实现大素数生成算法

    一.通过素数的基本性质 根据素数的性质(除了1和此整数(n)自身外,无法被其他自然数整除的数):即从2到n/2的数都不能整除n. 1 public static booleanisPrime(BigI ...

  6. 素数个数求解与素数的判定

    1.素数 质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个正因数的数). 对于写代码的人来说,素数比想像中 ...

  7. 经典加密算法的实现与破解大素数生成算法

    0x00 信息系统安全实验报告 实验(一):经典加密算法的实现与破解 1. 实现凯撒加密.暴力破解凯撒加密 2. 选取k值,编译凯撒加密算法 3. 编写算法尝试暴力破解凯撒加密 实验(二):大素数生成 ...

  8. 记一次使用快速幂与Miller-Rabin的大素数生成算法

    大家都知道RSA的加密的安全性就是能够找到一个合适的大素数,而现在判断大素数的办法有许多,比如Fermat素性测试或者Miller-Rabin素性测试,而这里我用了Miller-Rabin素性测试的算 ...

  9. C++实现伪大素数生成算法(费马小定理判别法、米勒拉宾素数判定法)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.伪大素数生成原理 方法一 方法二 数学基础 二.费马小定理判别法 1.算法 2.代码实现 3.运行结果 二.米勒拉宾素数 ...

  10. 你知道如何判定一个大整数为素数吗?——米勒拉宾素数判定算法

    米勒拉宾算法的基本概念如下: 首先判断这个数n的奇偶性 若为偶数仅有2是质数 奇数则进入测试 测试方法: 首先确定几个基底a,范围在[2,n-1] 因为n是奇数,所以n-1必定为偶数 则n-1可以表示 ...

最新文章

  1. DLPack构建跨框架深度学习编译器-实现张量之间的相互转换【pytorch】
  2. Windows消息:怎样使用RegisterWindowMessage注册消息
  3. Android窗口管理服务WindowManagerService的简要介绍和学习计划
  4. Java基础之this关键字和super关键字区别
  5. Qt学习笔记-使用QStyleFactory::create()变换风格
  6. ExtJS4之helloworld
  7. 14、任务十四——数组对象的处理、修改DOM中的内容
  8. vuejs2和echarts3组合显示图表
  9. 安卓最新版本_nyearlabel安卓下载-nyearlabel最新版本下载v1.2.3 安卓版
  10. 计算机潮流算法一般采用,计算机潮流计算
  11. 闲鱼选品的6个维度,附赠35个爆款品类!
  12. 苹果也能做深度学习了!PyTorch宣布支持苹果M1芯片GPU加速:训练快6倍,推理提升21倍...
  13. JavaPoet使用详解
  14. 阿里和微博的异地多活方案
  15. 吴晓波最劲爆演讲:终于把传统行业的转型升级都讲清楚了
  16. 微信小程序入门实例--地图
  17. 国家队ACM论文分类整理(转载)
  18. Visual Stdio 2022如何打开监视窗口?
  19. 图示虚拟机virtualbox在Ubuntu下的安装使用
  20. 博客保存大数据SQL相关

热门文章

  1. 施一公:优秀的科学家如何成长?
  2. (附源码)计算机毕业设计SSM基于远程协作的汽车故障诊断系统
  3. Python基础练习-每日一题-大家来找茬!
  4. movie制作的电影站wordpress视频主题
  5. 谈谈如何解决win7/win10/win11右键转圈卡顿问题
  6. linux如何打开22端口?如何开启ssh远程链接
  7. 微信公众平台开发(一) 申请微信公众账号
  8. 微信公众账号开发模式3
  9. 开启计算机远程桌面连接不上,解决win7系统远程桌面连接已开启却无法连接的方法有哪些...
  10. 超级计算机通信工程研发相关高校,[现场]世界大学生超级计算机竞赛ASC的第八年...