poj 2429 Pollard_rho大数分解
先对lcm/gcd进行分解,问题转变为从因子中选出一些数相乘,剩下的数也相乘,要求和最小。
这里能够直接搜索,注意一个问题,因为同样因子不能分配给两边(会改变gcd)所以能够将同样因子合并,这种话,搜索的层数也变的非常少了。
- #include<stdio.h>
- #include<string.h>
- #include<iostream>
- #include<math.h>
- #include<stdlib.h>
- #include<time.h>
- #include<algorithm>
- using namespace std;
- typedef long long LL;
- #define maxn 10000
- LL factor[maxn];
- int tot;
- const int S=10; //測试次数
- LL muti_mod(LL a,LL b,LL c)
- {
- a%=c;b%=c;
- LL ret=0;
- while (b){
- if (b&1){
- ret+=a;
- if (ret>=c) ret-=c;
- }
- a<<=1;
- if (a>=c) a-=c;
- b>>=1;
- }
- return ret;
- }
- LL pow_mod(LL x,LL n,LL mod)
- {
- if (n==1) return x%mod;
- int bit[90],k=0;
- while (n){
- bit[k++]=n&1;
- n>>=1;
- }
- LL ret=1;
- for (k=k-1;k>=0;k--){
- ret=muti_mod(ret,ret,mod);
- if (bit[k]==1) ret=muti_mod(ret,x,mod);
- }
- return ret;
- }
- bool check(LL a,LL n,LL x,LL t){ //以a为基,n-1=x*2^t,检验n是不是合数
- LL ret=pow_mod(a,x,n),last=ret;
- for (int i=1;i<=t;i++){
- ret=muti_mod(ret,ret,n);
- if (ret==1 && last!=1 && last!=n-1) return 1;
- last=ret;
- }
- if (ret!=1) return 1;
- return 0;
- }
- bool Miller_Rabin(LL n){ //是素数返回0,合数返回1
- LL x=n-1,t=0;
- while ((x&1)==0) x>>=1,t++;
- bool flag=1;
- if (t>=1 && (x&1)==1){
- for (int k=0;k<S;k++){
- LL a=rand()%(n-1)+1;
- if (check(a,n,x,t)) {flag=1;break;}
- flag=0;
- }
- }
- if (!flag || n==2) return 0;
- return 1;
- }
- LL gcd(LL a,LL b){
- if (a==0) return 1;
- if (a<0) return gcd(-a,b);
- while (b){
- LL t=a%b; a=b; b=t;
- }
- return a;
- }
- LL Pollard_rho(LL x,LL c){
- LL i=1,x0=rand()%x,y=x0,k=2;
- while (1){
- i++;
- x0=(muti_mod(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;
- }
- }
- }
- void findfac(LL n)//质因数分解,存在factor里
- {
- if (!Miller_Rabin(n)){
- factor[tot++] = n;
- return;
- }
- LL p=n;
- while (p>=n) p=Pollard_rho(p,rand() % (n-1) +1);
- findfac(p);
- findfac(n/p);
- }
- LL mins,aa,bb;
- int top;
- void dfs(LL a,LL b,int p)
- {
- if(a+b>=mins) return;
- if(p==top)
- {
- if(a+b<mins)
- {
- mins=a+b;
- aa=a;
- bb=b;
- }
- return;
- }
- dfs(a*factor[p],b,p+1);
- dfs(a,b*factor[p],p+1);
- }
- int main()
- {
- LL a,b,c;
- while(~scanf("%lld%lld",&a,&b))
- {
- if(a==b) {printf("%lld %lld\n",a,b);continue;}
- mins=~0ull>>1;
- c=b/a;
- tot=0;
- findfac(c);
- sort(factor,factor+tot);
- top=0;
- for(int i=0;i<tot;i++)
- {
- if(i==0) factor[top++]=factor[i];
- else if(factor[i]==factor[i-1]) factor[top-1]*=factor[i];
- else factor[top++]=factor[i];
- }
- dfs(a,a,0);
- if(aa>bb) swap(aa,bb);
- printf("%lld %lld\n",aa,bb);
- }
- return 0;
- }
poj 2429 Pollard_rho大数分解的更多相关文章
- Pollard_Rho大数分解模板题 pku-2191
题意:给你一个数n, 定义m=2k-1, {k|1<=k<=n},并且 k为素数; 当m为合数时,求分解为质因数,输出格式如下:47 * 178481 = 8388607 = ( ...
- 模板题Pollard_Rho大数分解 A - Prime Test POJ - 1811
题意:是素数就输出Prime,不是就输出最小因子. #include <cstdio> #include<time.h> #include <algorithm> ...
- poj 1811 随机素数和大数分解(模板)
Sample Input 2 5 10 Sample Output Prime 2 模板学习: 判断是否是素数,数据很大,所以用miller,不是的话再用pollard rho分解 miller : ...
- HDU4344(大数分解)
题目:Mark the Rope 题意就是给一个数,然后求这个数的所有因子中组成的最大的一个子集,其中1和本身除外,使得在这个子集中元素两两互素,求最大子集的元素个 数,并且求出和最大的值. 找规律就 ...
- Miller-Rabbin 素性测试 和 Pollard_rho整数分解
今天学习一下Miller-Rabbin 素性测试 和 Pollard_rho整数分解. 两者都是概率算法. Miller_Rabbin素性测试是对简单伪素数pseudoprime测试的改进. (ps ...
- poj1181 大数分解
//Accepted 164 KB 422 ms //类似poj2429 大数分解 #include <cstdio> #include <cstring> #include ...
- 数论 - Miller_Rabin素数测试 + pollard_rho算法分解质因数 ---- poj 1811 : Prime Test
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29046 Accepted: 7342 Case ...
- poj 1811 大数分解
模板 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> ...
- POJ 2429 GCD & LCM Inverse(Pollard_Rho+dfs)
[题目链接] http://poj.org/problem?id=2429 [题目大意] 给出最大公约数和最小公倍数,满足要求的x和y,且x+y最小 [题解] 我们发现,(x/gcd)*(y/gcd) ...
随机推荐
- PPT去掉图片白色背景
双击图片,点击菜单栏“删除背景”,用矩形框选中想要的区域,然后将鼠标焦点移到图片外,单击鼠标即可.
- 关于C#基类和子类函数调用问题
c#基类子类的函数调用关系,代码说明newkeyword后面的类中的函数为对象调用的函数,当然必需要有virtual和override,继承就相当于包括了基类的函数,子类对象调用时基类的函数相当于就在 ...
- 在多线程环境中使用Jedis
Jedis是一个Java语言的Redis客户端,它为Java语言连接与操作Redis提供了简单易用的接口. Jedis不是线程安全的.故不应该在多线程环境中共用一个Jedis实例.可是.也应该避免直接 ...
- 阿里云部署Docker(5)----管理和公布您的镜像
出到这节,我在百度搜索了一下"阿里云部署Docker",突然发现怎么会有人跟我写的一样呢?哦,原来是其它博客系统的爬虫来抓取,然后也不会写转载自什么什么的.所以,我最终明确为什么那 ...
- 4. 绘制光谱曲线QGraphicsView类
一.前言 Qt的QGraphicsView类具有强大的视图功能,与其一起使用的还有QGraphicsScene类和QGraphicsItem类.大体思路就是通过构建场景类,然后向场景对象中增加各种图元 ...
- 15. SSH 远程
一.原理: 使用SSH连接Centos时,我们可以创建一个公钥和一个私钥,公钥放在服务端,私钥放在客户端,当客户端去连接服务端时,会先去查找密钥, 要是客户端的私钥可以和服务端的公钥匹 ...
- SQL按汉语拼音首字母排序
以常用到的省的数据表(province)为例,其中name字段为省的名称,SQL语句如下: ))) as py ,a.name from province a left outer join ( se ...
- js基础-需要注意的地方
---因为跟别的语言很像,所以只记录要注意的地方 1.== 和 === 的区别 ===要求类型也相等 "5"==5 = ture "5"===5 = false ...
- C++中的条件传送代码
条件传送代码-这种代码先计算一个条件操作的两种结果,然后再条件从而选其中一个-条件传送代码匹配了现代处理器的性能特征(因为现代处理器是流水线) void minmax2(int a[],int b[] ...
- (整理)ubuntu 的 相关知识(来自 鸟哥的私房菜)
1. Linux 文件权限概念 $ ls 察看文件的指令 $ ls -al 出所有的文件详细的权限与属性 (包含隐藏档,就是文件名第一个字符为『 . 』的文件) 在你第一次以root身份登入Linux ...