POJ 2429 GCD & LCM Inverse(大整数素因子分解+二进制枚举)
来源:互联网 发布:三菱m70cnc传输软件 编辑:程序博客网 时间:2024/05/21 08:00
GCD & LCM Inverse
Time Limit: 2000MSMemory Limit: 65536KTotal Submissions: 16540Accepted: 3061
Description
Given two positive integers a and b, we can easily calculate the greatest common divisor (GCD) and the least common multiple (LCM) of a and b. But what about the inverse? That is: given GCD and LCM, finding a and b.
Input
The input contains multiple test cases, each of which contains two positive integers, the GCD and the LCM. You can assume that these two numbers are both less than 2^63.
Output
For each test case, output a and b in ascending order. If there are multiple solutions, output the pair with smallest a + b.
Sample Input
3 60
Sample Output
12 15
题目大意:
已知两个数的最大公约数 值为
解题思路:
假设这两个数字为
其中
那么就有
那么
那么我们首先将
那么我们需要保证的是两个数是互素的,所以两个数不能出现相同素因子,那么我们可以进行二进制枚举,判断这个素因子在
代码:
#include <iostream>#include <string.h>#include <string>#include <algorithm>#include <stdio.h>#include <stdlib.h>#include <math.h>#include <map>using namespace std;typedef long long LL;const int times=20;//随机算法判定次数map <LL, int>mp;//质因子的数目LL Multi(LL a, LL b, LL MOD){ LL ans = 0; while(b){ if(b & 1) ans = (ans + a) % MOD; b>>=1; a = (a + a) % MOD; } return ans;}LL Pow(LL a, LL b, LL MOD){ a = a % MOD; LL ans = 1; while(b){ if(b & 1) ans = Multi(ans, a, MOD); b>>=1; a = Multi(a, a, MOD); } return ans;}//若为合数返回true,不一定返回false//a^(n-1)=1(mod n) -> a^((2^t)*x)=-1(mod n) == a^x=1(mod n)bool test(LL a,LL n,LL x,LL t)//miLLer_rabin算法的核心{ LL res = Pow(a,x,n);//a^x mod n LL last = res; for(int i=1;i<=t;i++){ res=Multi(res,res,n);//res=res*res mod n if(res==1 && last!=1 && last!=n-1) return true; last=res; } if(res!=1) return true; return false;}//若为素数(或伪素数)返回true,合数返回falsebool miLLer_rabin(LL n){ if(n < 2) return false; if(n==2) return true; if((n&1)==0) return false; //偶数 LL x=n-1, t=0; while((x&1)==0)//n-1=(2^t)*x; { x>>=1; t++; } for(int i=0;i<times;i++)//进行随机判定 { LL a=rand()%(n-1)+1;//随机找0~n-1的整数 if(test(a,n,x,t)) return false; } return true;}LL factor[100];//保存质因数分解结果int tot;//记录质因数个数,下标从0开始LL GCD(LL a, LL b){ if(a < 0) return GCD(-a, b); if(b == 0) return a; return GCD(b, a%b);}LL pollard_rho(LL x,LL c){ LL i=1,k=2; LL x0=rand()%x; LL y=x0; while(1){ i++; x0=(Multi(x0,x0,x)+c)%x; LL d=GCD(y-x0,x); if(d!=1&&d!=x) return d; if(y==x0) return x; if(i==k){ y=x0; k+=k; } }}//对n进行素因子分解void find_factor(LL n){ if(miLLer_rabin(n))//若为素数 { factor[tot++]=n; mp[n]++; return ; } LL p=n; while(p>=n) p=pollard_rho(p,rand()%(n-1)+1); find_factor(p); find_factor(n/p);}LL pw(LL a, LL b){ LL ans = 1; while(b){ if(b & 1) ans = ans*a; b>>=1; a*=a; } return ans;}int main(){ LL a, b; while(cin>>a>>b){ if(a==b){printf("%lld %lld\n",a,b); continue;} tot = 0; mp.clear(); LL n = b/a; find_factor(n); sort(factor, factor+tot); tot = unique(factor, factor+tot)-factor; LL ans = b, aa, bb; int all = (1<<tot); for(int i=0; i<all; i++){ LL tp1 = 1, tp2 = 1; for(int j=0; j<tot; j++){ if(i&(1<<j)){ LL tmp = pw(factor[j] , mp[factor[j]]); tp1 *= tmp; } } tp2 = n / tp1; if(ans > tp1*a+tp2*a){ ans = tp1*a+tp2*a; aa = min(tp1, tp2); bb = max(tp1, tp2); } } printf("%lld %lld\n",aa*a, bb*a); } return 0;}
阅读全文
0 0
- POJ 2429 GCD & LCM Inverse(大整数素因子分解+二进制枚举)
- POJ 2429 GCD & LCM Inverse(Pollard-rho 大整数分解+DFS)
- POJ 2429 GCD & LCM Inverse(素数判定Miller-Rabin+素因子分解Pollard-rho)
- POJ 2429 GCD & LCM Inverse Pollard_rho大数因子分解
- POJ2429 GCD & LCM Inverse (大整数分解)
- POJ 2429 GCD & LCM Inverse (整数分解,由gcd+lcm求a,b)
- POJ 2429 GCD & LCM Inverse (大数分解)
- POJ 2429GCD & LCM Inverse(大数分解)
- POJ 2429 GCD & LCM Inverse(Pollard_rho法质因数分解)
- poj 2429 GCD & LCM Inverse(大数质因数分解+DFS)
- POJ2429 GCD & LCM Inverse pollard_rho大整数分解
- POJ 2429 GCD & LCM Inverse (大整数素性测试与因式分解)
- poj 2429 GCD & LCM Inverse(Miller_rabin 测试+pollard_rho大数分解)
- POJ 2429 GCD & LCM Inverse Pollard_Rho大数分解+Miller_Rabin
- poj 2429 GCD & LCM Inverse
- poj 2429 GCD & LCM Inverse
- poj 2429 GCD & LCM Inverse
- POJ 2429 GCD & LCM Inverse
- 排序
- Python 07 函数的定义与调用
- 内置对象--Array对象篇
- cout不明确
- POJ3984《迷宫问题》
- POJ 2429 GCD & LCM Inverse(大整数素因子分解+二进制枚举)
- Qt网络编程--HTTP服务器(二)
- 依赖注入导致的空指针异常
- Node Web
- 罗技G610:无驱动背光模式调整
- It is not safe to rely on the system's timezone settings. You are *required*
- centos 源码安装 apache2.4
- 测试之美
- OpenGL实现图片边缘暗角效果(1)