1 条题解
-
0
暴力会超时,我们需要进行预处理。
我们可以从开始枚举,遇到一个数据范围内的完全平方数就把他的倍数全部标记成幸运数(自己也算)。
同时我们可以定义一个数组,存入所有的幸运数。
预处理后,我们需要排序一下幸运数的数组。
对于每次询问,可以先从
bool
类型的标记数组中找到是否为幸运数。如果不是幸运数,可以选择时间复杂度在幸运数数组中二分查找,也可以在预处理的时候多用一些空间存储每一个数的下一个幸运数(时间复杂度)。
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
- 上传者