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; ///定理说明一定是素数(从推荐的那个博客中有讲原因)
else
return 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);
}else
printf("0\n");
return 0;
}

GCDLCM 【米勒_拉宾素数检验 (判断大素数)】的更多相关文章

  1. Miller_Rabbin算法判断大素数

    普通的素数测试我们有O(√ n)的试除算法.事实上,我们有O(s*log³n)的算法. 下面就介绍一下Miller_Rabbin算法思想: 定理一:假如p是质数,且(a,p)=1,那么a^(p-1)≡ ...

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

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

  3. 与数论的爱恨情仇--01:判断大素数的Miller-Rabin

    在我们需要判断一个数是否是素数的时候,最容易想到的就是那个熟悉的O(√n)的算法.那个算法非常的简单易懂,但如果我们仔细想想,当n这个数字很大的时候,这个算法其实是不够用的,时间复杂度会相对比较高. ...

  4. Miller_Rabin(米勒拉宾)素数测试

    2018-03-12 17:22:48 米勒-拉宾素性检验是一种素数判定法则,利用随机化算法判断一个数是合数还是可能是素数.卡内基梅隆大学的计算机系教授Gary Lee Miller首先提出了基于广义 ...

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

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

  6. HDU 2138 How many prime numbers (判素数,米勒拉宾算法)

    题意:给定一个数,判断是不是素数. 析:由于数太多,并且太大了,所以以前的方法都不适合,要用米勒拉宾算法. 代码如下: #include <iostream> #include <c ...

  7. csu 1552(米勒拉宾素数测试+二分图匹配)

    1552: Friends Time Limit: 3 Sec  Memory Limit: 256 MBSubmit: 723  Solved: 198[Submit][Status][Web Bo ...

  8. FZU 1649 Prime number or not米勒拉宾大素数判定方法。

    C - Prime number or not Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & % ...

  9. Miller_Rabin (米勒-拉宾) 素性测试

    之前一直对于这个神奇的素性判定方法感到痴迷而又没有时间去了解.借着学习<信息安全数学基础>将素性这一判定方法学习一遍. 首先证明一下费马小定理. 若p为素数,且gcd(a, p)=1, 则 ...

随机推荐

  1. hdu6090 菊花图

    Rikka with Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  2. C语言经典笔试题目

    1.bool,float,指针变量 与 “零值” 比较的if语句 注意点:c语言中bool类型采用整数存储,0为false,非0均为true; float类型采用IEEE754标准,第一位符号位,中间 ...

  3. 去重函数unique,sort,erase的应用

    std::unique 一.总述 unique函数属于STL中比较常用函数,它的功能是元素去重.即"删除"序列中所有相邻的重复元素(只保留一个).此处的删除,并不 是真的删除,而是 ...

  4. Altera的Cyclone系列器件命名规则

    Altera的Cyclone系列器件命名规则如下 器件系列 + 器件类型(是否含有高速串行收发器) +  LE逻辑单元数量 + 封装类型 + 高速串行收发器的数量(没有则不写) + 引脚数目 + 器件 ...

  5. 一文带你了解nginx基础

    学习nginx,就要先了解什么是nginx,为什么使用nginx,最后才是了解怎么使用nginx nginx简介 nginx安装 一.Linux中安装nginx 二.Docker中安装nginx 三. ...

  6. [JavaWeb基础] 014.Struts2 标签库学习

    在Struts1和Struts2中都有很多很方便使用的标签库,使用它可以让我们的页面代码更加的简洁,易懂,规范.标签的形式就跟html的标签形式一样.上面的篇章中我们也讲解了自定义标签那么在如何使用标 ...

  7. jdk生成keystore、tomcat配置https

    一.首先利用jdk自带工具keytool生成keystore,命令如下:keytool -genkey -alias tomcat -keypass 123456 -keyalg RSA -keysi ...

  8. MVVM 小雏形 knockout

    前言 knockout学过的当工具脚本用,就像jquery一样使用,学习成本15分钟,没学过的可学可不学. knockout 是上古神器,话说在远古开天辟地,前端到处是飞禽走兽,一片混乱. 这时候人类 ...

  9. JavaScript (五) js的基本语法 - - - 面向对象、工程模式、内置对象、JSON

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.编程思想 1.定义: 编程思想:把一些生活中做事的经验融入到程序中 面向过程:凡事都要亲力亲为,每件 ...

  10. Java实现 LeetCode 541 反转字符串 II(暴力大法)

    541. 反转字符串 II 给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转.如果剩余少于 k 个字符,则将剩余的所有全部反转.如果有小于 2k 但大于或 ...