王烯出的题:数论(素数筛选)

来源:互联网 发布:mac u盘 抹掉进程失败 编辑:程序博客网 时间:2024/06/03 22:42

Problem D: 属于ACMer的游戏 猜素数

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 56  Solved: 15
[Submit][Status][Web Board]

Description

ACM实验室的众大神们喜欢聚餐大家一起HAPPY 尤其卢学长喜欢请大家HAPPY,但是卢学长请吃饭有一个习惯,大家要一起玩一个热身游戏,猜素数.

游戏规则如下:

       正常人的版本是这样:比如卢学长先约定一个数,并约定一个范围比如1~1000,然后大家开始猜范围内的数,逐渐缩小范围,比如唐学长是卢学长的下一个位置的人,然后唐学长猜了550,如果和卢学长约定的数一样则唐学长接受惩罚,否则缩小范围如果约定的数大于550则范围变成550~1000,否则变成1~550.同理挨个猜数,直到有人接受惩罚。

       但是ACM实验室的众大神的版本作了一点点改进,即事先约定的数和后面猜的数必须是素数 这可难为了冷神,冷神不知道一共会有多少素数。所以只能拜托机智的众学弟学妹了。

输入两个数a,b(1<=a,b<=10^7)判断a,b范围内(包括a,b)会有多少素数呢?

数据不保证a小于b。

                                                              

Input

a,b两个数(1<=a,b<=10^7)

Output

t 表示范围内有多少个素数

Sample Input

1 10
15 20
2 300

Sample Output

4
2
62


简单的素数筛选题目,好久没写了。。。

要用到打表保存结果的思想

代码如下:

#include <cstdio>#include <cstring>#include <algorithm>#define MAXN 10001000using namespace std; int ans[MAXN+10];bool vis[MAXN+10]; void init() {    for(int i=2; i*i<MAXN; ++i) {        if(!vis[i]) {            for(int j=i*i; j<MAXN; j+=i) {                vis[j] = true;            }        }    }         ans[0] = ans[1] = 0;    for(int i=2; i<MAXN; ++i) {        ans[i] = ans[i-1];        if(!vis[i])            ++ans[i];    }} int main(void) {    init();    int a, b, x, y;    while(scanf("%d%d", &a, &b) != EOF) {        printf("%d\n", ans[max(a, b)]-ans[min(a, b)-1]);    }    return 0;}


0 0
原创粉丝点击