Dual Prime
[ Submit Code ] [ Top 20 Runs ] [ Runs Status ]
Acceteped : 1498 Submit : 3901
Time Limit : 2000 MS Memory Limit : 65536 KB
Description
Dual Prime
题目描述
如果一个合数x=p⋅q,p,q是素数且p≠q,我们称x是双素数。 现给你一个区间[a,b],求区间内的的双素数个数。
输入
第一行是一个整数T(1≤T≤30000),为样例的数目。 以后每行一个样例,为两个整数a,b(1≤a≤b≤106)
输出
依次每行输出一个样例的结果。
样例输入
3
1 10
1 100
1 1000000
样例输出
2
30
209867
Sample Input
Sample Output
Source
[ Submit Code ] [ Top 20 Runs ] [ Runs Status ]
[ Home Page ] [ Go Back ]
#include <stdio.h>
int ans[1000001]={0};//ans[i]=1表示i是双素数
int isprime[1000001]={0};//isprime[i]=1表示i为素数
int prime[1000001];//prime存储的是素数
int sum[1000001];//sum[i]表示1到i之间有多少个双素数
int main()
{
int K;
scanf("%d",&K);
int a,b;
int i,j;
int t;
for(i=0;i<=1000000;i++)
{
isprime[i]=1;
}
isprime[0]=0;
isprime[1]=0;
for(i=2;i<=1000000;i++) //不是素数的话就记为0
{
if(isprime[i]==0)
{
continue;
}
else
{
for(j=i+i;j<=1000000;j=j+i)
{
isprime[j]=0;
}
}
}
int c=0;//表示共有c个素数
for(i=0;i<=1000000;i++) //将素数存起来
{
if(isprime[i]==1)
{
prime[c]=i;
c++;
}
}
for(i=0;i<c;i++)
{
if(prime[i]*2>1000000)
{
break;
}
for(j=1;j<c;j++)
{
if(i==j)
{
continue;
}
t=prime[i]*prime[j];
if(t>1000000)
{
break;
}
ans[t]=1;
continue;
}
}
for(i=0;i<=1000000;i++)
{
sum[i]=0;
}
for(i=1;i<=1000000;i++)
{
if(ans[i]==1)
{
sum[i]=1;
}
sum[i]=sum[i]+sum[i-1];
}
while(K--)
{
scanf("%d%d",&a,&b);
printf("%d\n",sum[b]-sum[a-1]);
}
return 0;
}