poj 2429 Pollard_rho大数分解
来源:互联网 发布:mysql入门经典pdf微盘 编辑:程序博客网 时间:2024/04/29 07:52
先对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 10000LL 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;}
4 0
- poj 2429 Pollard_rho大数分解
- POJ 2429 GCD & LCM Inverse Pollard_rho大数因子分解
- poj 2429 GCD & LCM Inverse(Miller_rabin 测试+pollard_rho大数分解)
- POJ 2429 GCD & LCM Inverse Pollard_Rho大数分解+Miller_Rabin
- 大数分解Pollard_rho模板
- pollard_rho大数分解Java版
- 模板,pollard_rho大数因数分解
- pollard_rho(大数质因子分解)
- 大数因数分解Pollard_rho 算法
- HDU 3864 pollard_rho大数质因子分解
- 大数因数分解Pollard_rho 算法详解
- 大数因数分解Pollard_rho 算法详解
- POJ 2429 -- miller-rabin素数测试,Pollard_rho素因子分解
- POJ 2429 GCD & LCM Inverse(Pollard_rho法质因数分解)
- [POJ 1811 Prime Test] Miller_Rabin + Pollard_rho 大数质数判断/质因子分解模板
- poj 1811 + poj 2429 (Miller_Rabin大素数测试 + Pollard_Rho大合数分解)
- HDU 4344 Mark the Rope Pollard_Rho大数分解
- NJUST 1722 所有的平方差 Pollard_Rho大数分解
- 微策略2012笔试题-棋盘寻宝加强版
- Windows Message Queue(优先队列)
- jar打包成exe文件 exe4j使用篇(一)
- [水]ZOJ1622
- Codeforces Round #260 (Div. 2)455A - Boredom (DP)
- poj 2429 Pollard_rho大数分解
- Table 'database1.xxx' doesn't exist
- 封装排序专题,按姓名排序,年龄排序,Block排序
- 数据存取之DOM解析
- AspNetPager真假分页对比实例
- c++文件流基本用法(fstream, ifstream, ostream)
- 一个android工程的运行过程[转]
- 字符串
- 用Eclipse搭建Android开发环境