1、报数
题目大意是将所有包含数字7的数的倍数(如7、14、17、27等)全部筛去,然后输入某个数字,输出这个数字的下一个不是倍数的数字(如输入6,输出8,不能是7)。T次询问。
1
<
=
x
<
=
1
×
1
0
7
1<=x<=1 \times10^7
1<=x<=1×107
1
<
=
T
<
=
2
×
1
0
5
1<=T<=2 \times10^5
1<=T<=2×105
显然需要预处理,先把所有包含数字7的数字找出来,利用欧拉筛的思想,将所有倍数都筛出。然后用数组标记一下每个数的下一个数是什么即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 10000001;
int T;
int num[MAXN],nxt[MAXN];
bool vis[MAXN];
bool pd(int x){
while(x){
int t = x % 10;
x /= 10;
if(t == 7)
return true;
}
return false;
}
void solve(){
int x, tot = 0;
cin >> T;
for(int i = 1;i <= MAXN;i ++){
if(pd(i)){
num[++ tot] = i;
vis[i] = 1;
}
}
for(int i = 1;i <= MAXN;i ++){
for(int j = 1;j <= tot && i * num[j] <= MAXN;j ++){
vis[i * num[j]] = 1;
if(i % num[j] == 0) break;
}
}
int pre = 0;
for(int i = 1;i <= MAXN;i ++){
if(vis[i] == 0){
nxt[pre] = i;
pre = i;
}
}
while(T --){
scanf("%d",&x);
if(vis[x]) cout << "-1" << endl;
else cout << nxt[x] << endl;
}
return;
}
int main(){
solve();
return 0;
}