洛谷 P1865 A % B Problem 线性筛素数+前缀和

洛谷 P1865 A % B Problem 线性筛素数+前缀和

代码如下:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#include<string>
#include<vector>
#define MAX 1000005
typedef long long ll;
using namespace std;

int n,m,l,r,dp[MAX];
bool isprime[MAX];

void eratos(){//线性筛素数
    for(int i=0;i<=MAX;i++){
        isprime[i]=true;
    }
    isprime[0]=isprime[1]=false;//删除0和1

    for(int i=2;i*i<=MAX;i++){//留下i,删除i的倍数
      if(isprime[i]){
          int j=i+i;
          while(j<=MAX){
              isprime[j]=false;
              j=j+i;
          }
      }
    }
}

int main(){
    scanf("%d%d",&n,&m);
    dp[1]=0,dp[2]=1;
    eratos();//线性筛素数
    for(int i=3;i<=m;i++){//前缀和
        if(isprime[i]){
            dp[i]=dp[i-1]+1;
        }else{
            dp[i]=dp[i-1];
        }
    }

    for(int i=0;i<n;i++){
        scanf("%d%d",&l,&r);
        if(l<1||l>m||r<1||r>m){
            printf("Crossing the line\n");
            continue;
        }
        printf("%d\n",dp[r]-dp[l-1]);
    }

    return 0;
}
发布了253 篇原创文章 · 获赞 15 · 访问量 7979

猜你喜欢

转载自blog.csdn.net/weixin_44123362/article/details/103915677