
看到题目,可能会以为是什么 mg 数学 or 线性筛
其实只要类似埃拉托色尼筛法,这样处理:
因为范围是 107 , 于是只要遍历 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) { for(int i = 7; i < N; i++) if(has7(i)) { 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; } 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); if(*p == x) printf("%d\n", *(p + 1)); else printf("%d\n", -1); } return 0; }
|