0%

NOIP2021报数

PicFailedPlelaseAskMaster

看到题目,可能会以为是什么 mg 数学 or 线性筛
其实只要类似埃拉托色尼筛法,这样处理:

因为范围是 10710^7 , 于是只要遍历 1 到 1e7 的每一个数,然后判断这个数里面有没有7,如果有,
就把它的倍数都遍历一下。。。
额,是不是很简单?

本来是会超时的,但是吸了氧。。。额

过了

PS:考场没注意吸氧,写了个打表,傻傻问了监考员说没事,然后爆零了。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include<bits/stdc++.h>
using namespace std;
const int N = 1e7 + 10;
int a[N];
int b[N];

bool has7(int k)
{
while(k)
{
if(k % 10 == 7) return 1;
k /= 10;
}
return 0;
}

int main(void)
{
// a[7] = 1;
for(int i = 7; i < N; i++)
if(has7(i))
{
// if(i == 7) printf("OOOHH!!!\n");
for(int j = i; j < N; j += i)
{
a[j] = 1;
}
}

int cnt = 0;
for(int i = 0; i < N; i++)
if(!a[i])
{
b[++cnt] = i;
// if(i < 1000) printf("----%d\n", i);
}


int T, x;
scanf("%d", &T);
for(int i = 1; i <= T; i++)
{
scanf("%d", &x);
int *p = lower_bound(b + 1, b + cnt + 1, x);
// printf("%d", )
if(*p == x) printf("%d\n", *(p + 1));
else printf("%d\n", -1);
}
return 0;
}

欢迎关注我的其它发布渠道