【数论】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;
}


posted @ 2014-08-17 09:46  kewowlo  阅读(189)  评论(0编辑  收藏  举报