您的位置:首页 > 其它

【数论】CF 385C Bear and Prime Numbers

2014-08-17 09:46 369 查看
地址:点击打开链接

预处理出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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: