http://codeforces.com/problemset/problem/1285/C
水题想一年,学弟7分钟就过了。
a*b/gcd(a,b)=X,已知X,要求max(a,b)最小,我们可以贪心地想到gcd(a,b)=1比较好,这样max(a,b)小一些
于是我们知道把X质因数分解,把不同质因子一部分给a,一部分给b,使得max(a,b)最小
结果我一开始贪心去了。。。。但是贪心明显是错的。我不知道在干撒
最后发现不同质因子的数量其实很少,前20个质数已经超过10^12了,所以只需要dfs判断哪些给a,哪些给b即可
看了牛逼网友的发现直接枚举到根号就行了。。。。然后再判断下gcd是不是1.。。。我真傻真的.jpg
#include<bits/stdc++.h>
#define maxl 1000010
using namespace std;
int n,m;
long long X,a,b,ans;
int p[maxl];
long long c[maxl];
bool ok[maxl];
char s[maxl];
inline void shai()
{
ok[1]=true;int j,t;
for(int i=2;i<maxl;i++)
{
if(!ok[i]) p[++p[0]]=i;
t=p[1]*i;j=1;
while(t<maxl && j<=p[0])
{
ok[t]=true;
if(i%p[j]==0)
break;
t=p[++j]*i;
}
}
}
inline void prework()
{
scanf("%lld",&X);
shai();
}
inline bool cmp(const int &a,const int &b)
{
return a>b;
}
inline void dfs(int k,long long ta,long long tb)
{
if(max(ta,tb)>ans)
return;
ta*=c[k];
if(k<c[0])
dfs(k+1,ta,tb);
else
{
if(max(ta,tb)<ans)
{
ans=max(ta,tb);
a=ta;b=tb;
}
}
ta/=c[k];
tb*=c[k];
if(k<c[0])
dfs(k+1,ta,tb);
else
{
if(max(ta,tb)<ans)
{
ans=max(ta,tb);
a=ta;b=tb;
}
}
tb/=c[k];
}
inline void mainwork()
{
a=1;b=X;ans=X;long long tmp=X;
for(int i=1;i<=p[0];i++)
if(X%p[i]==0)
{
tmp=1;
while(X%p[i]==0)
X/=p[i],tmp*=p[i];
c[++c[0]]=tmp;
}
if(X>1)
c[++c[0]]=X;
if(c[0]==0)
return;
sort(c+1,c+1+c[0],cmp);
dfs(1,1,1);
}
inline void print()
{
printf("%lld %lld",a,b);
}
int main()
{
int t=1;
//scanf("%d",&t);
for(int i=1;i<=t;i++)
{
prework();
mainwork();
print();
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
long long x,a,b;
int main()
{
scanf("%lld",&x);
long long l=sqrt(x);
for(long long i=l;i>=1;i--)
if(x%i==0 && __gcd(i,x/i)==1)
{
printf("%lld %lld",i,x/i);
return 0;
}
}