洛谷-1865 A % B Problem

    xiaoxiao2023-10-03  163

    题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数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 -109<=l<=r<=109 1<=t<=1000000

    解释:线性筛一遍,然后统计前缀和就好了,其他技巧吃完在学。

    #include<cstring> #include<cstdio> const int MAXN=1000010; bool prime[MAXN]; int Prime[MAXN]; int sum[MAXN]={0}; int num=0; void make_prime(){ memset(prime,true,sizeof(prime)); prime[0]=prime[1]=false; for(int i=2;i<=MAXN;i++){ if(prime[i]){ Prime[num++]=i; } for(int j=0;j<num&&i*Prime[j]<MAXN;j++){ prime[i*Prime[j]]=false; if(!(i%Prime[j])) break; } } for(int i=1;i<=MAXN;i++){ sum[i]=sum[i-1]+int(prime[i]); } return; } int main(){ int n=0,m=0; scanf("%d%d",&m,&n); make_prime(); while(m--){ int l=0,r=0;scanf("%d%d",&l,&r); if(r<=n&&r>=1&&l<=n&&l>=1){ printf("%d\n",sum[r]-sum[l-1]); }else{ printf("Crossing the line\n"); } } return 0; }
    最新回复(0)