POJ 2429
思路:a/n*b/n=lcm/gcd 所以这道题就是分解ans.dfs枚举每种素数情况。套Miller_Rabin和pollard_rho模板
- //#pragma comment(linker, "/STACK:167772160")//手动扩栈~~~~hdu 用c++交
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- #include<iostream>
- #include<queue>
- #include<stack>
- #include<cmath>
- #include<set>
- #include<algorithm>
- #include<vector>
- // #include<malloc.h>
- using namespace std;
- #define clc(a,b) memset(a,b,sizeof(a))
- #define inf (LL)1<<61
- #define LL long long
- const double eps = 1e-;
- const double pi = acos(-);
- // inline int r(){
- // int x=0,f=1;char ch=getchar();
- // while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();}
- // while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
- // return x*f;
- // }
- const int Times = ;
- const int N = ;
- LL n, m, ct, cnt;
- LL minn, mina, minb, ans;
- LL fac[N], num[N];
- LL gcd(LL a, LL b)
- {
- return b? gcd(b, a % b) : a;
- }
- LL multi(LL a, LL b, LL m)
- {
- LL ans = ;
- a %= m;
- while(b)
- {
- if(b & )
- {
- ans = (ans + a) % m;
- b--;
- }
- b >>= ;
- a = (a + a) % m;
- }
- return ans;
- }
- LL quick_mod(LL a, LL b, LL m)
- {
- LL ans = ;
- a %= m;
- while(b)
- {
- if(b & )
- {
- ans = multi(ans, a, m);
- b--;
- }
- b >>= ;
- a = multi(a, a, m);
- }
- return ans;
- }
- bool Miller_Rabin(LL n)
- {
- if(n == ) return true;
- if(n < || !(n & )) return false;
- LL m = n - ;
- int k = ;
- while((m & ) == )
- {
- k++;
- m >>= ;
- }
- for(int i=; i<Times; i++)
- {
- LL a = rand() % (n - ) + ;
- LL x = quick_mod(a, m, n);
- LL y = ;
- for(int j=; j<k; j++)
- {
- y = multi(x, x, n);
- if(y == && x != && x != n - ) return false;
- x = y;
- }
- if(y != ) return false;
- }
- return true;
- }
- LL pollard_rho(LL n, LL c)
- {
- LL i = , k = ;
- LL x = rand() % (n - ) + ;
- LL y = x;
- while(true)
- {
- i++;
- x = (multi(x, x, n) + c) % n;
- LL d = gcd((y - x + n) % n, n);
- if( < d && d < n) return d;
- if(y == x) return n;
- if(i == k)
- {
- y = x;
- k <<= ;
- }
- }
- }
- void find(LL n, int c)
- {
- if(n == ) return;
- if(Miller_Rabin(n))
- {
- fac[ct++] = n;
- return ;
- }
- LL p = n;
- LL k = c;
- while(p >= n) p = pollard_rho(p, c--);
- find(p, k);
- find(n / p, k);
- }
- void dfs(LL dept, LL tem=)
- {
- if(dept == cnt)
- {
- LL a = tem;
- LL b = ans / a;
- if(gcd(a, b) == )
- {
- a *= n;
- b *= n;
- if(a + b < minn)
- {
- minn = a + b;
- mina = a;
- minb = b;
- }
- }
- return ;
- }
- for(int i=; i<=num[dept]; i++)
- {
- if(tem > minn) return;
- dfs(dept + , tem);
- tem *= fac[dept];
- }
- }
- int main()
- {
- while(~scanf("%llu %llu", &n, &m))
- {
- if(n == m)
- {
- printf("%llu %llu\n",n,m);
- continue;
- }
- minn = inf;
- ct = cnt = ;
- ans = m / n;
- find(ans, );
- sort(fac, fac + ct);
- num[] = ;
- int k = ;
- for(int i=; i<ct; i++)
- {
- if(fac[i] == fac[i-])
- ++num[k-];
- else
- {
- num[k] = ;
- fac[k++] = fac[i];
- }
- }
- cnt = k;
- dfs(, );
- if(mina > minb) swap(mina, minb);
- printf("%llu %llu\n",mina, minb);
- }
- return ;
- }
POJ 2429的更多相关文章
- 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
GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10621 Accepted: ...
- POJ 2429 long long 质因数分解
GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16206 Accepted: ...
- Mathematics:GCD & LCM Inverse(POJ 2429)
根据最大公约数和最小公倍数求原来的两个数 题目大意,不翻译了,就是上面链接的意思. 具体思路就是要根据数论来,设a和b的GCD(最大公约数)和LCM(最小公倍数),则a/GCD*b/GCD=LCM/G ...
- 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 Pollard_rho大数分解
先对lcm/gcd进行分解,问题转变为从因子中选出一些数相乘,剩下的数也相乘,要求和最小. 这里能够直接搜索,注意一个问题,因为同样因子不能分配给两边(会改变gcd)所以能够将同样因子合并,这种话,搜 ...
- poj 2429 GCD & LCM Inverse 【java】+【数学】
GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9928 Accepted: ...
- 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 (Miller-Rabin素数测试和Pollard_Rho_因数分解)
本题涉及的算法个人无法完全理解,在此提供两个比较好的参考. 原理 (后来又看了一下,其实这篇文章问题还是有的……有时间再搜集一下资料) 代码实现 #include <algorithm> ...
随机推荐
- 优化SQL Server数据库查询方法
SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列 ...
- PAT-乙级-1032. 挖掘机技术哪家强(20)
1032. 挖掘机技术哪家强(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 为了用事实说明挖掘机技术到底 ...
- zoj 3720
为什么注释掉的地方是错的? 自己的代码好糟烂..... 直接枚举点 判是否在多边形内 加起来求概率 求面积的时候代码写搓了.... 比不过别人两行的代码 而且到现在还找不到错 ...
- POJ 1850 Code(组合数)
http://poj.org/problem?id=1850 题意 :给定字符串,系统是用字符串组成的,字符串是按字典序排的.编码系统有三条规则,1这些的单词的长度是由小到大的,2相同长度的按字母在字 ...
- Servlet课程0424(一) 通过实现Servlet接口来开发Servlet
//这是我的第一个Servlet,使用实现Servlet接口的方式来开发 package com.tsinghua; import javax.servlet.*; import java.io.*; ...
- Android性能优化典范 - 第2季
Google发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的缩放,缓 ...
- 简单的神经元算法实现(python)
参考python代码如下 #perceptron x=[[1 ,0, 0],[1,0,1],[1, 1, 0],[1, 1, 1],[0,0,1],[0,1,0],[0,1,1],[0,0,0]] y ...
- node.js模块之fs文件系统
fs 模块是文件操作的封装,它提供了文件的读取.写入.更名.删除.遍历目录.链接等 POSIX 文件系统操作.与其他模块不同的是,fs 模块中所有的操作都提供了异步的和同步的两个版本, 例如读取文件内 ...
- netty 实现socket服务端编写
import java.net.InetSocketAddress; import io.netty.bootstrap.ServerBootstrap; import io.netty.channe ...
- CentOS 6.4 编译安装Mysql 5.6.14
概述: CentOS 6.4下通过yum安装的MySQL是5.1版的,比较老,所以就想通过源代码安装高版本的5.6.14. 正文: 一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server ...