码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 385C Bear and Prime Numbers [素数筛法]

时间:2015-04-14 00:44:46      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:




Code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#define INF 0x7fffffff
#define SUP 0x80000000
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;

typedef long long LL;
const int N=1000007;

int tot;
int pri[N];
bool valid[10*N];
int s[N];
int cnt[10*N];

void GetPri()
{
    mem(valid,true);
    mem(s,0);
    valid[1]=false;
    tot=0;
    for(int i=2;i<=10000000;i++)
    {
        if(valid[i])
        {
            pri[++tot]=i;
            s[tot]=s[tot-1]+cnt[i];  //维护前缀和
            for(int j=i+i;j<=10000000;j+=i)
            {
                s[tot]+=cnt[j];   //利用筛法的性质
                valid[j]=false;
            }
        }
    }
    //for(int i=1;i<=10;i++)
    //    printf("%d %d\n",pri[i],s[i]);
}

int main()
{

    int n,m,v;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&v);
        cnt[v]++;
    }
    GetPri();
    pri[++tot]=(1<<31-1);

    int l,r,x,y;
    scanf("%d",&m);
    for(int i=0;i<m;i++)
    {
        scanf("%d%d",&l,&r);
        x=lower_bound(pri+1,pri+tot,l)-pri;
        y=upper_bound(pri+1,pri+tot,r)-pri-1;
        //cout<<x<<"^"<<y<<endl;
        if(x<=y)
            printf("%d\n",s[y]-s[x-1]);
        else
            printf("0\n");
    }
    return 0;
}














//好吧=_=!
//下面是我的脑残代码(线晒+合数分解+树状树状+二分)
//就权且当模板用吧。
/* 
int pri[N];
bool valid[10000007];
int dp[N];
int c[N];
int tot;
void getpri()
{
    mem(valid,true);
    tot=0;valid[1]=false;
    for(int i=2;i<=10000000;i++)
    {
        if(valid[i]) pri[++tot]=i;
        for(int j=1;(j<=tot)&&(i*pri[j]<=10000000);j++)
        {
            valid[i*pri[j]]=false; Ïê¼ûºìiutyuop¡¾
            if(i%pri[j]==0) break;
        }//cout<<"--"<<endl;
    }
}
int lowbit(int x)
{
    return x&(-x);
}

void add(int x,int v)
{
    for(int i=x;i<=tot;i+=lowbit(i))
        c[i]+=v;
}

int sum(int x)
{
    if(dp[x]!=-1) return dp[x];
    int ret=0;
    for(int i=x;i>0;i-=lowbit(i))
        ret+=c[i];
    dp[x]=ret;
    return ret;
}

void pribreak(int x)
{
    for(int i=1;i<=tot;i++)
    {
        if(x%pri[i]==0){
            add(i,1);
        }
        while(x%pri[i]==0)
        {
            x/=pri[i];
        }
        if(x==1)
            return;
    }
}


int main()
{
    int n,m;
    getpri();
    pri[++tot]=(1<<31-1);
    while(scanf("%d",&n)==1)
    {
        int a;
        mem(c,0);
        mem(dp,-1);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a);
            pribreak(a);
        }

        //for(int i=1;i<=10;i++)
        //    printf("%d %d--\n",pri[i],c[i]);
        scanf("%d",&m);
        int l,r,x,y;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&l,&r);
            x=lower_bound(pri+1,pri+tot,l)-pri;
            y=upper_bound(pri+1,pri+tot,r)-pri-1;
            if(x<=y)
                printf("%d\n",sum(y)-sum(x-1));
            else
                printf("0\n");
        }
    }
    return 0;
}
*/


Codeforces 385C Bear and Prime Numbers [素数筛法]

标签:

原文地址:http://blog.csdn.net/code_or_code/article/details/45035157

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!