洛谷P1865 A % B Problem

1、洛谷P1865 A % B Problem

题目背景

题目名称是吸引你点进来的 实际上该题还是很水的

题目描述

区间质数个数

输入输出格式

输入格式:

一行两个整数 询问次数n,范围m

接下来n行,每行两个整数 l,r 表示区间

输出格式:

对于每次询问输出个数 t,如l或r∉[1,m]输出 Crossing the line

输入输出样例

输入样例#1:

2 5
1 3
2 6

输出样例#1:

2
Crossing the line

说明

【数据范围和约定】

对于20%的数据 1<=n<=10 1<=m<=10

对于100%的数据 1<=n<=1000 1<=m<=1000000 -10^9<=l<=r<=10^9 1<=t<=1000000

 1 /*筛法求素数
 2 用到二分,否则可能严重超时!!*/
 3 
 4 #include<iostream>
 5 #include<cstdio>
 6 #include<cstring>
 7 using namespace std;
 8 int x,y,n,m;
 9 int num;// 质数的个数 
10 int a[1000001];//储存质数 
11 bool f[1000001]={0};//判断是否为质数 
12 void solve(int x,int y)//二分解决 
13 {
14     int l=0,r=0,left=1,right=num;
15     while (left<=right)//二分查找 1到所要求的区间左端点的质数的个数 
16     {
17         int mid=(left+right)>>1;//最终得到mid值为1到x的质数个数 
18         if (a[mid]>=x) //mid指向的质数大于左端点,向左二分 
19         {
20             l=mid;//
21             right=mid-1;
22         }
23         else
24             left=mid+1;
25     }
26     //从1到右端点的质数个数 
27     if (y>=a[num])//y大于最大的质数,1到y的质数个数为该范围的质数个数 
28         r=num;
29     else
30     {
31         left=1;
32         right=num;
33         while (left<=right) 
34         {
35             int mid=(left+right)>>1;
36             if (a[mid]>y)
37             {
38                 r=mid-1;
39                 right=mid-1;
40             }
41             else
42                 left=mid+1;
43         }
44     }
45     printf("%d\n",r-l+1);
46 }
47 void chuli()
48 {
49     for(int i=2;i<=m;i++)
50     if(f[i]==0)//是素数 
51     {
52         a[++num]=i;//储存
53         int x=2;
54         while(x*i<=m)
55         {
56             f[x*i]=true;//筛掉倍数 
57             x++;
58         }
59     }
60 }
61 int main()
62 {
63     scanf("%d%d",&n,&m);
64     chuli();
65     for(int i=1;i<=n;i++)
66     {
67         scanf("%d%d",&x,&y);
68         if(x<1||y>m)printf("Crossing the line\n");
69         else solve(x,y);
70     }
71     
72     return 0;
73 }

 

posted @ 2016-06-07 15:07  [lemon]  阅读(177)  评论(0编辑  收藏  举报
……