[POJ 2429] GCD & LCM Inverse
| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 10621 | Accepted: 1939 |
Description
Input
Output
Sample Input
3 60
Sample Output
12 15
Source
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <ctime>
using namespace std;
#define INF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define S 8 ll mult(ll a,ll b,ll mod)
{
a%=mod,b%=mod;
ll ret=;
while(b)
{
if(b&)
{
ret+=a;
if(ret>=mod) ret-=mod;
}
a<<=;
if(a>=mod) a-=mod;
b>>=;
}
return ret;
}
ll pow(ll a,ll n,ll mod)
{
a=a%mod;
ll ret=;
while(n)
{
if(n&) ret=mult(ret,a,mod);
a=mult(a,a,mod);
n>>=;
}
return ret;
}
bool check(ll a,ll n,ll x,ll t)
{
ll ret=pow(a,x,n),last=ret;
for(int i=;i<=t;i++)
{
ret=mult(ret,ret,n);
if(ret== && last!= && last!=n-) return ;
last=ret;
}
if(ret!=) return ;
return ;
}
bool Miller_Rabin(ll n)
{
if(n<) return ;
if(n==) return ;
if((n&)==) return ;
ll x=n-,t=;
while((x&)==) { x>>=;t++;}
srand(time(NULL));
for(int i=;i<S;i++)
{
ll a=rand()%(n-)+;
if(check(a,n,x,t)) return ;
}
return ;
}
int tot;
ll factor[];
ll gcd(ll a,ll b)
{
ll t;
while(b)
{
t=a;
a=b;
b=t%b;
}
if(a>=) return a;
return -a;
}
ll pollard_rho(ll x,ll c)
{
ll i=,k=;
srand(time(NULL));
ll x0=rand()%(x-)+;
ll y=x0;
while()
{
i++;
x0=(mult(x0,x0,x)+c)%x;
ll d=gcd(y-x0,x);
if(d!= && d!=x) return d;
if(y==x0) return x;
if(i==k) y=x0,k+=k;
}
}
void FindFac(ll n,int k=)
{
if(n==) return;
if(Miller_Rabin(n))
{
factor[tot++]=n;
return;
}
ll p=n;
int c=k;
while(p>=n) p=pollard_rho(p,c--);
FindFac(p,k);
FindFac(n/p,k);
}
ll ansx,ansy,ans;
void dfs(int k,ll x,ll y)
{
if(k>=tot)
{
if(x+y<ans)
{
ans=x+y;
ansx=x;
ansy=y;
}
return;
}
dfs(k+,x*factor[k],y);
dfs(k+,x,y*factor[k]);
}
int main()
{
int i,j;
ll n,m;
while(scanf("%lld%lld",&m,&n)!=EOF)
{
tot=;
ans=INF; //注意初始化
FindFac(n/m,);
sort(factor,factor+tot);
for(i=j=;i<tot;i++)
{
ll tmp=factor[i];
while(i+<tot && factor[i]==factor[i+]) //注意边界
{
tmp*=factor[i];
i++;
}
factor[j++]=tmp;
}
tot=j;
dfs(,,);
if(ansx>ansy) swap(ansx,ansy);
printf("%lld %lld\n",ansx*m,ansy*m);
}
return ;
}
[POJ 2429] GCD & LCM Inverse的更多相关文章
- POJ 2429 GCD & LCM Inverse(Pollard_Rho+dfs)
[题目链接] http://poj.org/problem?id=2429 [题目大意] 给出最大公约数和最小公倍数,满足要求的x和y,且x+y最小 [题解] 我们发现,(x/gcd)*(y/gcd) ...
- POJ 2429 GCD & LCM Inverse (Pollard rho整数分解+dfs枚举)
题意:给出a和b的gcd和lcm,让你求a和b.按升序输出a和b.若有多组满足条件的a和b,那么输出a+b最小的.思路:lcm=a*b/gcd lcm/gcd=a/gcd*b/gcd 可知a/gc ...
- POJ 2429 GCD & LCM Inverse(Miller-Rabbin素性测试,Pollard rho质因子分解)
x = lcm/gcd,假设答案为a,b,那么a*b = x且gcd(a,b) = 1,因为均值不等式所以当a越接近sqrt(x),a+b越小. x的范围是int64的,所以要用Pollard_rho ...
- POJ:2429-GCD & LCM Inverse(素数判断神题)(Millar-Rabin素性判断和Pollard-rho因子分解)
原题链接:http://poj.org/problem?id=2429 GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K To ...
- poj 2429 GCD & LCM Inverse 【java】+【数学】
GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9928 Accepted: ...
- Mathematics:GCD & LCM Inverse(POJ 2429)
根据最大公约数和最小公倍数求原来的两个数 题目大意,不翻译了,就是上面链接的意思. 具体思路就是要根据数论来,设a和b的GCD(最大公约数)和LCM(最小公倍数),则a/GCD*b/GCD=LCM/G ...
- POJ2429 GCD & LCM Inverse pollard_rho大整数分解
Given two positive integers a and b, we can easily calculate the greatest common divisor (GCD) and t ...
- 【poj 2429】GCD & LCM Inverse (Miller-Rabin素数测试和Pollard_Rho_因数分解)
本题涉及的算法个人无法完全理解,在此提供两个比较好的参考. 原理 (后来又看了一下,其实这篇文章问题还是有的……有时间再搜集一下资料) 代码实现 #include <algorithm> ...
- poj2429 GCD & LCM Inverse
用miller_rabin 和 pollard_rho对大数因式分解,再用dfs寻找答案即可. http://poj.org/problem?id=2429 #include <cstdio&g ...
随机推荐
- 采集/自动登录啊都可以用这两个方法实现 asp.net
/// <summary> /// 通过get方式发送xmlHttp请求,并获得响应数据 /// </summary> /// <param name="Url ...
- 给虚拟机中的CentOS7配置固定ip
在虚拟机中安装完了CentOS7之后,使用了DHCP来获取ip,vmware的网络连接使用了NAT模式.但是在把Linux设置为固定ip地址后,虚拟机里的linux可以ping通全网段的ip地址,但是 ...
- Programming Collective Intelligence
最近正在拜读 O'reilly出版的Programming Collective Intelligence,准备研究研究搜索引擎了,童鞋们,到时候会考虑公布源码哦!
- SQL动态更新表字段 传入字段可能为空
小技巧: 项目组有修改产品的基本信息字段 但有时候传入的字段可能为空 也可能不为空 动态修改表中字段. USE [BetaProductMarket_DB] GO )) BEGIN DROP PRO ...
- Android判断用户是平板还是手机的方法
public boolean isTabletDevice() { TelephonyManager telephony = (TelephonyManager) mContext.ge ...
- Android “NetworkOnMainThreadException”出错原因及解决办法
原因: 不允许在主线程中通讯 方法1:非要在主线程中,当然也可以,这样去处理: StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Build ...
- WRS是什么?
全球参考系(WRS)是为卫星下行数据服务而建立的一种全球符号坐标系统,本文详细介绍了Landsat卫星的轨道特性,给出了相应的WRS网格坐标位置的估算方法,并给出了估算的结果。对该方法的研究为地面应用 ...
- 转:深入学习Oracle分区表及分区索引
转自:http://database.ctocio.com.cn/tips/286/8104286.shtml 关于分区表和分区索引(About Partitioned Tables and Inde ...
- 【 socke】C# socket端口复用-多主机头绑定
什么是端口复用: 因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分.这种多重绑定便称之为端口复用 ...
- easyui使用时出现这个Uncaught TypeError: Cannot read property 'combo' of undefined
easyui使用时出现这个Uncaught TypeError: Cannot read property 'nodeName' of undefined 最后检查发现是必须给select一个id,光 ...