zoukankan      html  css  js  c++  java
  • 洛谷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
    ",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
    ");
    69         else solve(x,y);
    70     }
    71     
    72     return 0;
    73 }
  • 相关阅读:
    二进制数组ArrayBuffer
    iperf3测量一个网络最大带宽
    Proxy与Reflect
    Symbol
    Iterator
    Set与Map
    Generator
    Android 共享参数 SharedPreferences
    DDMS files not found: xxxhprof-conv.exe
    Android 状态栏通知 Notification
  • 原文地址:https://www.cnblogs.com/xiaoningmeng/p/5567043.html
Copyright © 2011-2022 走看看