首页 > 其他 > 详细

SPOJ-2

时间:2015-10-07 22:40:58      阅读:257      评论:0      收藏:0      [点我收藏+]

这题目猛一看是个水题,仔细一看还真是个水题,好吧其实大神们都不用仔细看的。

基本思路就是筛法求素数,这个题M,N数值大,但|N-M|较小。

所以先列出sqrt(N)的素数表,之后从素数表中选数去M~N中剔除。(懒省事就直接提前打好素数表了)

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 
 5 //31623
 6 
 7 int a[3401] = {2~31607的所有质数} //太长了
 8 
 9 bool b[100010];
10 
11 int main(void)
12 {
13   int M, N;
14   int T;
15   int k;
16   scanf("%d", &T);
17   while(T--){
18     scanf("%d%d", &M, &N);
19     if(M == 1) M = 2;
20     memset(b, true, sizeof(b));//printf("%d\n", b[6]);
21     for(int i = 0; i <= 3400; ++i){
22       k = (M / a[i] + 1) * a[i];//Never write anymore
23       if(k == a[i]) k += a[i];
24       if((M % a[i] == 0) && (M != a[i])) b[0] = false;
25       while(k <= N){
26     b[k-M] = false;
27     k += a[i];
28     //printf("%d %d %d\n", k, a[i], b[0]);
29       }
30     }
31     for(int i = 0; i <= N-M; ++i)
32       if(b[i])
33     printf("%d\n", i+M);
34     printf("\n");
35   }
36   return 0;
37 }

1.对于学过pascal的人来说,memset中的sizeof到底放在哪里,真的是很纠结。

2.memset()在<cstring>里,在<cstring>里,在<cstring>里!

SPOJ-2

原文:http://www.cnblogs.com/xuezhonghao/p/4859556.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!