1. 程式人生 > >Codeforces385C Bear and Prime Numbers(數論+打表)

Codeforces385C Bear and Prime Numbers(數論+打表)

題意:給一個數列(無規則排列,會重複)再給m個查詢範圍,查詢每個查詢範圍內的素數能整除數列中的數的數量和(有點繞口)
其實這道題本質上不是很難,然後T的我想吐。先篩一個素數表,然後一邊打表一邊做一個字首和的統計。我用的類似埃氏篩法做表,因為我之前用歐氏篩法做表,莫名WA了,然後用了比較擅長的埃氏篩法。
T了N次,原因很多,我就不細說了,直接貼程式碼。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=10000005;
bool
vis[maxn]; int b[maxn]={0}; int qzh[maxn]={0}; int n; void prime() { memset(vis,true,sizeof vis); for(int i=2;i<=maxn;i++) { if(vis[i]) { qzh[i]+=b[i]; for(int j=i*2;j<maxn;j+=i) { qzh[i]+=b[j]; vis[j]=false; } } qzh[i]+=qzh[i-1]; } } int main() { cin>>n; while
(n--) { int a; scanf("%d",&a); b[a]++; } prime(); int m; scanf("%d",&m); while(m--) { int p,q; scanf("%d%d",&p,&q); if(p>maxn)p=maxn-1; if(q>maxn)q=maxn-1; printf("%d\n",qzh[q]-qzh[p-1]); } }