目录
- 思路答疑
B3929 [GESP202312 五级] 小杨的幸运数
- @ 2026-7-22 17:11:25
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int a, N;
cin >> a >> N;
vector<int> query(N);
int maxX = 0;
// 读入所有询问,并记录询问中的最大值
for (int i = 0; i < N; i++) {
cin >> query[i];
maxX = max(maxX, query[i]);
}
// 找到不小于 a 的最小完全平方数
int p = sqrt(a);
while (1LL * p * p < a) p++;
int firstSquare = p * p;
/*
firstSquare 本身是超级幸运数,
因此它的所有倍数都是幸运数。
任意一个数向后增加不超过 firstSquare,
一定可以遇到 firstSquare 的某个倍数。
*/
int limit = maxX + firstSquare;
// lucky[i] 表示 i 是否为幸运数
vector<bool> lucky(limit + 1, false);
/*
枚举所有不小于 a 的完全平方数 square,
将 square 的所有倍数标记为幸运数。
*/
for (int i = p; 1LL * i * i <= limit; i++) {
int square = i * i;
for (int j = square; j <= limit; j += square)
lucky[j] = true;
}
/*
nxt[i] 表示不小于 i 的第一个幸运数。
从右向左扫描:
如果当前位置是幸运数,就更新最近的幸运数。
*/
vector<int> nxt(limit + 1);
int nearest = -1;
for (int i = limit; i >= 1; i--) {
if (lucky[i]) nearest = i;
nxt[i] = nearest;
}
// 回答每个询问
for (int x : query) {
if (lucky[x]) cout << "lucky\n";
else cout << nxt[x] << '\n';
}
return 0;
}
0 条评论
目前还没有评论...
京公网安备11010802045784号
YIZHIYANG 一只羊 LV 9