【数论】CF 385C Bear and Prime Numbers
地址:点击打开链接
预处理出10^7次内的素数
再将输入的xi因数分解
让sum[i]统计1-i内的素数个数
输出即为sum[r]-sum[l-1];
注意l和r大于maxn的情况
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <string> #include <iostream> #include <algorithm> using namespace std; #include <queue> #include <stack> #include <vector> #include <deque> #include <set> #include <map> #define IN freopen ("in.txt" , "r" , stdin); #define OUT freopen ("out.txt" , "w" , stdout); typedef long long LL; const int MAXN = 1000;//点数的最大值 const int MAXM = 20006;//边数的最大值 const int INF = 11521204; const int mod=1000000007; int prim[10001001],sum[10010010],num; bool yes[MAXN]; void getprim() { memset(sum,0,sizeof(sum)); memset(yes,false,sizeof(yes)); num=0; for(int i=2; i<=MAXN; i++) { if(!yes[i]) { prim[num++]=i; for(int j=i+i; j<=MAXN; j+=i) yes[j]=true; } } } int main() { int n,a; scanf("%d",&n); getprim(); for(int i=0; i<n; i++) { scanf("%d",&a); for(int i=0; prim[i]*prim[i]<=a; i++) { if(a%prim[i]==0) { sum[prim[i]]++; while(a%prim[i]==0) a/=prim[i]; } } if(a!=1) sum[a]++; } for(int i=3; i<=MAXN; i++) sum[i]+=sum[i-1]; int q,l,r; scanf("%d",&q); while(q--) { scanf("%d%d",&l,&r); l=min(l,MAXN); r=min(r,MAXN); printf("%d\n",sum[r]-sum[l-1]); } return 0; }