首先LCM(a,b)=X,说明a*b>=X,当且仅当a,b互质时相等,题意要让a,b都尽可能小,最好让a*b=X,即a,b互质。原因如下:
最小公倍数由a、b中最大数量的质因数相乘得到。
如果a,b含有相同质因数,如果a中含质因数c的数量小于b,那么a去除所有c,显然lcm不变,这样将a、b中所有不必要的质因数去除后,显然a、b已经没有公共的质因数,于是a、b互质,要取max(a,b)最小,可以交换a、b中的质因数,这样可以找到最小的一对。
于是可以遍历sqrt(X),比较互质的因数即可。
AC代码:
# include <bits/stdc++.h> using namespace std; long long X,ansa,ansb=1e17; int main(){ cin>>X; for(long long i=1;i*i<=X;++i){ if(X%i) continue; long long a=i,b=X/i; if(a*b/__gcd(a,b)==X&&b<ansb) { ansa=a;ansb=b; } } cout<<ansa<<" "<<ansb; return 0; }