列表

详情


NC256764. 游游的数值距离

描述

游游拿到了一个正整数n,她希望找到一对正整数x,y,满足|x! \times y-y -n|最小,且x,y都不等于2,感叹号表示阶乘。你能帮帮她吗?

输入描述

一个正整数n
1 \leq n \leq 10^9

输出描述

输出两个正整数,分别表示x,y
如果有多解,输出任意一解即可通过。

示例1

输入:

2

输出:

1 1

说明:

|x!\times y - y-n|=|1 \times 1 - 1 - 2| = 2

示例2

输入:

25

输出:

3 5

说明:

|x!\times y - y-n|=|3\times 2 \times 1 \times 5 -5 - 25| = 0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 70ms, 内存消耗: 21236K, 提交时间: 2023-08-06 20:51:17

import math
a=[1]
for i in range(1,14):
    a.append(a[-1]*i)
n=int(input())
r=[1,1]
w=n
for i in range(3,len(a)):
    y=max(n//(a[i]-1),1)
    if w > abs((a[i] - 1) * y - n) and y != 2:
        r = [i, y]
        w = abs((a[i] - 1) * y - n)
    y+=1
    if w > abs((a[i] - 1) * y - n) and y != 2:
        r = [i, y]
        w = abs((a[i] - 1) * y - n)
print(*r)

C++(clang++ 11.0.1) 解法, 执行用时: 4ms, 内存消耗: 664K, 提交时间: 2023-08-08 19:53:29

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
    cin>>n;
	int s=n;
	int m=2,x=1,y=1;
	for(int i=3;i<=10;i++)
    { 
		m*=i;
		int t=m-1;
		int k=n/t; 
		if(abs(t*k-n)<s&&k!=2)
        {
			s=abs(t*k-n);
			x=i;
			y=k;
		}
        if((t*(k+1)-n)<s&&k+1!=2)
        {
			x=i;
			y=k+1;
		}
	}
	printf("%d %d",x,y);
}

Python3 解法, 执行用时: 42ms, 内存消耗: 4608K, 提交时间: 2023-08-06 19:36:30

n=int(input())
d=[1,1,n]
q=2
for x in range(3,50):
    q*=x
    y=n//(q-1)
    if y==0:
        y=1
    p=abs(q*y-y-n)
    if p<d[-1] and y!=2:
        d=[x,y,p]
    y+=1
    p=abs(q*y-y-n)
    if p<d[-1] and y!=2:
        d=[x,y,p]
print(*d[:2])

上一题