cf 385 C. Bear and Prime Numbers
题目大意:有一个数列{xi},每次给出一个询问[l, r],即问 S(l ,r)是l和r之间的素数,f(p)表示数列{xi}中整除p的个数
思路:筛法,显然xi的顺序是无所谓的,我们把它记录下来,然后做筛法,如果一个素数筛合数的过程中遇到一个数的话显然得记到这个素数的头上,然后再把这样得到的表求一个sum就行
1 #include<iostream> 2 #include<cstdio> 3 #define maxn 10000009 4 int sum[maxn*5],ans[maxn*5]; 5 bool visit[maxn*5]; 6 int main() 7 { 8 int n,m,x,y; 9 scanf("%d",&n); 10 for(int i=1;i<=n;i++) 11 { 12 scanf("%d",&x); 13 sum[x]++; 14 } 15 for(int i=2;i<=maxn;i++) 16 { 17 if(!visit[i]) 18 { 19 for(int j=1;j*i<=maxn;j++) 20 { 21 visit[i*j]=1; 22 ans[i]+=sum[i*j]; 23 } 24 } 25 ans[i]+=ans[i-1]; 26 } 27 scanf("%d",&m); 28 for(int i=1;i<=m;i++) 29 { 30 scanf("%d%d",&x,&y); 31 if(x>=maxn )x=maxn; 32 if(y>maxn)y=maxn; 33 printf("%d\n",ans[y]-ans[x-1]); 34 } 35 36 return 0; 37 }