
//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); } ; }