携程T3只过了83.3%,求帮看看是啥问题

携程T3只过了83.3%,求帮看看是啥问题

#include <bits/stdc++.h>
using namespace std;

inline long long read(){
    long long x = 0;
    char ch = getchar();
    while(ch < '0' || ch > '9'){
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9'){
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = getchar();
    }
    return x;
}

long long n;

// |x! * y - y - n| 最小
// 即 构造 x, y, 使得 (x! - 1) * y 最接近 n
// info[i] = i! - 1
long long info[] = {-1, 0, -1, 5, 23, 119, 719, 5039, 40319, 362879, 3628799, 39916799, 479001599};

int main(){
    n = read();
    long long x = 1, y = 1;
    long long mmin = 0x7FFFFFFFFFFFFFFF;
    
    // 枚举 所有的 (x! - 1), 计算 使 (x! - 1) * y 最接近 n 的 y
    for(long long i = 3; i < 13; i++){
        if(info[i] > n){
            break;
        }
        long long mod = n % info[i];
        mod = min(mod, abs((n / info[i]) * info[i] - n));
        if(mod < mmin){
            mmin = mod;
            x = i;
            y = n / info[i];
        }
    }
    cout << x << ' ' << y << endl;
    return 0;
}

全部评论
是不是没有考虑 (x!-1) * y == (n / info[i] + 1) * info[i] 的情况,这个时候 y 应该等于 n / info[i] + 1
点赞 回复 分享
发布于 2023-03-29 22:11 四川
有特判y不等于2吗😂
点赞 回复 分享
发布于 2023-03-29 22:26 湖北

相关推荐

10-25 12:05
已编辑
湖南科技大学 Java
若梦难了:我有你这简历,已经大厂乱杀了
点赞 评论 收藏
分享
11-07 13:31
怀化学院 Java
勇敢牛牛不怕难:又疯一个
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务