题目:P1835 素数密度
题目中区间的端点很大,但是区间的长度不长.
解题思路:
1.先用埃氏筛选掉 1 到 sqrt(R) 的合数
2.用第一步的素数表筛选掉 L 到 R 的合数 (一二步一起进行)
3.计算素数个数
代码:
#include<bits/stdc++.h> using namespace std; const int MA = 1e6+5; typedef long long LL; bool book[MA]; bool a[MA]; LL pri[MA]; LL cnt = 0; void Prime(LL L,LL R){ memset(book,true,sizeof(book)); memset(a,true,sizeof(a)); book[0] = false , book[1] = false; for(LL i = 2 ; i * i <= R ; i++){ if(book[i]){ pri[cnt++] = i; for(LL j = i + i ; j * j <= R ; j += i){ book[j] = false; } LL t = (L+i-1)/i;//向上进位 for(LL j = t * i ; j <= R ; j += i){ a[j-L]=false; } } } } int main(){ LL L,R; scanf("%lld %lld",&L,&R); Prime(L,R); LL ans = 0; for(LL i=0;i<=R-L;i++){ if(a[i] == true)ans++; } printf("%lld ",ans); return 0; }