題意:
給n個數的數列,m個區間詢問,每個詢問需要回答在區間[L,R]內每個質數在數列中有多少個數可以整除他們,並計算總和
input:
6
5 5 7 10 14 15
3
2 11
3 12
4 4
output:
9
7
0
題解:
起初我是想從拆解數列的素數因子,後來細想總體的方向就不對。首先把數列hash存入,按照埃式篩法的思想,搞個dp,這個dp其實就是前綴和數組,整個大體思路主要就凸顯在埃篩這裏,很簡單的一道數論題。
code:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e7+5;
int s[maxn],t,p[maxn],a[maxn],n,m;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&t);
s[t]++;
}
for(int i=2;i<maxn;i++){
a[i]=a[i-1];
if(p[i])continue;
a[i]+=s[i];
for(int j=i+i;j<maxn;j+=i){//逆推,搞定所有素因子
p[j]=1;
a[i]+=s[j];
}
}
scanf("%d",&m);
for(int i=1;i<=m;i++){
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",a[min(maxn-1,r)]-a[min(maxn-1,l-1)]);
}
return 0;
}
``