1 条题解

  • 0
    @ 2024-2-5 17:50:40

    暴力会超时,我们需要进行预处理。

    我们可以从aa开始枚举,遇到一个数据范围内的完全平方数就把他的倍数全部标记成幸运数(自己也算)。

    同时我们可以定义一个数组,存入所有的幸运数。

    预处理后,我们需要排序一下幸运数的数组。

    对于每次询问,可以先从 bool 类型的标记数组中找到是否为幸运数。

    如果不是幸运数,可以选择O(logn)O(log n)时间复杂度在幸运数数组中二分查找,也可以在预处理的时候多用一些空间存储每一个数的下一个幸运数(时间复杂度O(1)O(1))。

    AC Code

    #include<bits/stdc++.h>
    using namespace std;
    bool isLucky[2000010];
    vector<int> luck;
    inline bool iswp(int x){
    int k = sqrt(x);
    return k * k == x;
    }
    inline int find(int x){
    if(luck[0] > x) return luck[0];
    int l = 0, r = luck.size() - 1;
    while(l <= r){
    int mid = (l+r) >> 1;
    if(luck[mid] > x && luck[mid-1] < x){
    return luck[mid];
    }
    if(luck[mid] < x){
    l = mid + 1;
    }
    if(luck[mid-1] > x){
    r = mid - 1;
    }
    }
    return -1;
    }
    int main(){
    int a, N;
    cin >> a >> N;
    for(int i = a; i < 2000010; i++){
    if(iswp(i)){
    for(int j = i; j < 2000010; j += i){
    isLucky[j] = true;
    luck.push_back(j);
    }
    }
    }
    sort(luck.begin(), luck.end());
    while(N--){
    int x;
    cin >> x;
    if(isLucky[x]){
    cout << "lucky" << endl;
    }else{
    cout << find(x) << endl;
    }
    }
    return 0;
    }
    

    代码太长,就不排版了~~(逃)~~

    • 1

    信息

    ID
    9489
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    5
    已通过
    2
    上传者