牛客补题
数值距离
题目
游游拿到了一个正整数n,她希望找到一对正整数x,y,满足∣x!×y−y−n∣最小,且x,y都不等于2,感叹号表示阶乘。你能帮帮她吗?
输入描述:
1、一个正整数
2、 1≤n≤1e9
输出描述:
- 输出两个正整数,分别表示 x,y。
- 如果有多解,输出任意一解即可通过。
示例
输入 | 输出 | 解释 |
---|---|---|
2 | 1 1 | ∣x!×y−y−n∣=∣1×1−1−2∣=2 |
25 | 3 5 | ∣x!×y−y−n∣=∣3×2×1×5−5−25∣=0 |
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int fact[20];
void init()//阶乘
{
fact[0]=1;
for(int i=1;i<15;i++) fact[i]=fact[i-1]*i;//阶乘递归
}
signed main()
{
int n;
cin>>n;
//|(x!-1)*y-n|最小,x和y不等于2
init();
int mi=n,x=1,y=1;
for(int i=3;i<15;i++)
{
if(i==2) continue;
int k=fact[i]-1;
int ty=n/k;
int t1=abs(k*ty-n);
if(t1<mi && ty!=2)
{
mi=t1;
x=i;
y=ty;
}
ty++;
int t2=abs(k*ty-n);
if(t2<mi && ty!=2)
{
mi=t2;
x=i;
y=ty;
}
}
//k*y-n,k=x!-1
cout<<x<<" "<<y<<endl;
return 0;
}