T3
注意到 不能太大,所以 的取值非常小。
那么可以枚举 ,然后二分出在 的情况下 的最小值,再减一就是 的情况下 的最大值。
判断是否更优即可。
注意 。
//Man always remember love because of romance only!
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
int X=0,w=0; char ch=0;
while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
return w?-X:X;
}
inline void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
signed main(){
int n=read();
int sum=1;
int ans=2e9;
int nx,ny;
for(int x=1;sum<=2e9;x++){
sum*=x;
if(x==2) continue;
int tp=sum-1;
int l=3,r=1e9;
int res=-1;
while(l<=r){
int mid=(l+r)/2;
if(mid*tp-n>=0) res=mid,r=mid-1;
else l=mid+1;
}
ans=min(ans,abs(tp-n));
if(ans==abs(tp-n)){
nx=x,ny=1;
}
if(res==-1) continue;
ans=min(ans,abs(res*tp-n));
if(ans==abs(res*tp-n)){
nx=x,ny=res;
}
if(res!=3){
ans=min(ans,abs((res-1)*tp-n));
if(ans==abs((res-1)*tp-n)){
nx=x,ny=res-1;
}
}
// cout<<ans<<endl;
}
cout<<nx<<" "<<ny;
return 0;
}