poj2429 大数分解+dfs

时间:2023-03-09 16:33:53
poj2429 大数分解+dfs
 //Accepted    172 KB    172 ms
 //该程序为随机性算法,运行时间不定
 #include <cstdio>
 #include <cstring>
 #include <iostream>
 #include <ctime>
 #include <algorithm>
 using namespace std;
 ],factor_top=-;
 //gcd
 long long gcd(long long a,long long b)
 {
     ) return a;
     return gcd(b,a%b);
 }
 //a*b%n n<2^62
 long long mult_mod(long long a,long long b,long long n)
 {
     ;
     while (b)
     {
         )
         {
             res+=exp;
             if (res>n) res-=n;
         }
         exp<<=;
         if (exp>n) exp-=n;
         b>>=;
     }
     return res;
 }
 //return a^b%n
 long long exp_mod(long long a,long long b,long long n)
 {
     ,exp=a%n;
     )
     {
         )
         {
             res=mult_mod(res,exp,n);
         }
         exp=mult_mod(exp,exp,n);
         b>>=;
     }
     return res;
 }
 //miller_rabin 算法进行素数判定
 //判断次数times次 一般取times=10
 //return true 则n为素数
 bool miller_rabin(long long n,long long times)
 {
     ) return true;
      || !(n&)) return false;
     ,x,y;
     ;
     ==)
     {
        t++;
        u/=;
     }
     srand(time());
     ;i<times;i++)
     {
         a=rand()%(n-)+;
         x=exp_mod(a,u,n);
         ;j<t;j++)
         {
             y=mult_mod(x,x,n);
              && x!= && x!=n-)
             return false; //not prime
             x=y;
         }
         ) return false;
     }
     return true;
 }
 //pollar_rho 求n的一个质因子
 //c 为测试函数中的常数
 long long pollard_rho(long long n,int c)
 {
     ,k=;
     srand(time());
     x=rand()%(n-)+;
     y=x;
     while (true)
     {
          i++;
          x=(mult_mod(x,x,n)+c)%n;
          d=gcd(y-x,n);
           && d<n) return d;
          if (y==x) return n;
          if (i==k)
          {
              y=x;
              k<<=;
          }
     }
 }
 //找出n的所用质因子
 void findFactor(long long n,int c)
 {
     ) return ;
     ))
     {
         factor[++factor_top]=n;
         return ;
     }
     long long p=n;
     while (p>=n)
     {
         p=pollard_rho(p,c--);
     }
     findFactor(p,c);
     findFactor(n/p,c);
 }
 ];
 int m;
 int cmp(long long a,long long b)
 {
     return a>b;
 }
 void slove()
 {
     sort(factor,factor+factor_top+,cmp);
     m=;
     a[]=factor[];
     ;i<factor_top;i++)
     {
         ])
         {
             a[m]*=factor[i];
         }
         else
         {
             m++;
             a[m]=factor[i+];
         }
     }
 }
 long long minx,ans;
 void dfs(int s,long long num,long long t)
 {
     )
     {
          || (num+t/num<minx))
         {
             minx=num+t/num;
             ans=num;
         }
         return ;
     }
     dfs(s+,a[s]*num,t);
     dfs(s+,num,t);
 }
 int main()
 {
     __int64 s,t,n;
     while (scanf("%I64d%I64d",&s,&t)!=EOF)
     {
         n=t/s;
         if (s==t)
         {
             printf("%I64d %I64d\n",s,t);
             continue;
         }
         //printf("%I64d\n",gcd(t,s));
         factor_top=-;
         findFactor(n,);
         //printf("findFactor()\n");
         m=;
         slove();
         //printf("slove()\n");
         minx=-;
         dfs(,,n);
         //printf("dfs()\n");
         if (ans>n/ans) ans=n/ans;
         printf("%I64d %I64d\n",ans*s,n/ans*s);
     }
     ;
 }