【正经题解】报数
2024-02-21 13:44:30
发布于:浙江
17阅读
0回复
0点赞
我们只需要把每个有 的数找出来然后把它的倍数都标记为不合法,并将每个不含有 且未被标记过的数加入合法序列中,再将这个数及其对应的下标存入一个映射。这样,在输入时若这个数合法,我们就可以找出它在合法序列中的下标,从而找到序列中的下一个合法数。注意:这个 指的是输入数的范围,因此最终的答案有可能是超过 的,所以我们应该多算出一个合法数。
#include<bits/stdc++.h>
using namespace std;
const int INF = 1e7 + 1e6;
bool vis[INF + 10];
map<int, int>ko;
long long t, x, ok[INF + 10], tot = 0;
void p(long long m) {
long long s = m;
while (m != 0) {
if (m % 10 == 7) {
for (long long i = 1; i * s <= INF; i++)vis[i * s] = true;
break;
}
m /= 10;
}
}
int main() {
//freopen("number.in","r",stdin);
//freopen("number.out","w",stdout);
for (long long i = 1; i <= INF; i++) {
if (vis[i] == true)continue;
p(i);
if (!vis[i]) {
ok[++tot] = i;
ko[i] = tot;
}
}
cin.tie();
cin >> t;
while (t--) {
cin >> x;
if (vis[x])cout << -1 << endl;
else cout << ok[ko[x] + 1] << endl;
}
return 0;
}
这里空空如也
有帮助,赞一个