首页 > 代码库 > poj2429 大数分解+dfs
poj2429 大数分解+dfs
1 //Accepted 172 KB 172 ms 2 //该程序为随机性算法,运行时间不定 3 #include <cstdio> 4 #include <cstring> 5 #include <iostream> 6 #include <ctime> 7 #include <algorithm> 8 using namespace std; 9 long long factor[1000],factor_top=-1; 10 //gcd 11 long long gcd(long long a,long long b) 12 { 13 if (b==0) return a; 14 return gcd(b,a%b); 15 } 16 //a*b%n n<2^62 17 long long mult_mod(long long a,long long b,long long n) 18 { 19 long long exp=a%n,res=0; 20 while (b) 21 { 22 if (b&1) 23 { 24 res+=exp; 25 if (res>n) res-=n; 26 } 27 exp<<=1; 28 if (exp>n) exp-=n; 29 b>>=1; 30 } 31 return res; 32 } 33 //return a^b%n 34 long long exp_mod(long long a,long long b,long long n) 35 { 36 long long res=1,exp=a%n; 37 while (b>=1) 38 { 39 if (b&1) 40 { 41 res=mult_mod(res,exp,n); 42 } 43 exp=mult_mod(exp,exp,n); 44 b>>=1; 45 } 46 return res; 47 } 48 //miller_rabin 算法进行素数判定 49 //判断次数times次 一般取times=10 50 //return true 则n为素数 51 bool miller_rabin(long long n,long long times) 52 { 53 if (n==2) return true; 54 if (n<2 || !(n&1)) return false; 55 long long a,u=n-1,x,y; 56 int t=0; 57 while (u%2==0) 58 { 59 t++; 60 u/=2; 61 } 62 srand(time(0)); 63 for (int i=0;i<times;i++) 64 { 65 a=rand()%(n-1)+1; 66 x=exp_mod(a,u,n); 67 for (int j=0;j<t;j++) 68 { 69 y=mult_mod(x,x,n); 70 if (y==1 && x!=1 && x!=n-1) 71 return false; //not prime 72 x=y; 73 } 74 if (y!=1) return false; 75 } 76 return true; 77 } 78 //pollar_rho 求n的一个质因子 79 //c 为测试函数中的常数 80 long long pollard_rho(long long n,int c) 81 { 82 long long x,y,d,i=1,k=2; 83 srand(time(0)); 84 x=rand()%(n-1)+1; 85 y=x; 86 while (true) 87 { 88 i++; 89 x=(mult_mod(x,x,n)+c)%n; 90 d=gcd(y-x,n); 91 if (d>1 && d<n) return d; 92 if (y==x) return n; 93 if (i==k) 94 { 95 y=x; 96 k<<=1; 97 } 98 } 99 }100 //找出n的所用质因子101 void findFactor(long long n,int c)102 {103 if (n==1) return ;104 if (miller_rabin(n,10))105 {106 factor[++factor_top]=n;107 return ;108 }109 long long p=n;110 while (p>=n)111 {112 p=pollard_rho(p,c--);113 }114 findFactor(p,c);115 findFactor(n/p,c);116 }117 long long a[1000];118 int m;119 int cmp(long long a,long long b)120 {121 return a>b;122 }123 void slove()124 {125 sort(factor,factor+factor_top+1,cmp);126 m=0;127 a[0]=factor[0];128 for (long long i=0;i<factor_top;i++)129 {130 if (factor[i]==factor[i+1])131 {132 a[m]*=factor[i];133 }134 else135 {136 m++;137 a[m]=factor[i+1];138 }139 }140 }141 long long minx,ans;142 void dfs(int s,long long num,long long t)143 {144 if (s==m+1)145 {146 if (minx==-1 || (num+t/num<minx))147 {148 minx=num+t/num;149 ans=num;150 }151 return ;152 }153 dfs(s+1,a[s]*num,t);154 dfs(s+1,num,t);155 }156 int main()157 {158 __int64 s,t,n;159 while (scanf("%I64d%I64d",&s,&t)!=EOF)160 {161 n=t/s;162 if (s==t)163 {164 printf("%I64d %I64d\n",s,t);165 continue;166 }167 //printf("%I64d\n",gcd(t,s));168 factor_top=-1;169 findFactor(n,107);170 //printf("findFactor()\n");171 m=0;172 slove();173 //printf("slove()\n");174 minx=-1;175 dfs(0,1,n);176 //printf("dfs()\n");177 if (ans>n/ans) ans=n/ans;178 printf("%I64d %I64d\n",ans*s,n/ans*s);179 }180 return 0;181 }
poj2429 大数分解+dfs
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。