cf #226 div2 C(dp,區間,math)

題意:
給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;
}

``
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章