Description
如果一个合数x=p⋅q,p,q是素数且p≠q ,我们称x是双素数。 现给你一个区间[a,b] ,求区间内的的双素数个数。
Input
第一行是一个整数T(1≤T≤30000) ,为样例的数目。以后每行一个样例,为两个整数a,b(1≤a≤b≤1e6 )
Output
依次每行输出一个样例的结果。
Sample Input
3
1 10
1 100
1 1000000
Sample Output
2
30
209867
解题思路:
[a,b]区间的双素个数=[1,b]区间的双素个数减去[1,a]区间的双素个数。定义一个数组用来存放区间[1,i]的双素数个数,然后输出数组[b]-数组[a-1]即可。
#include<bits/stdc++.h>
using namespace std;
#define N 1000001
int a[N];
int b[N];
int main()
{
int i,j;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
//将所有非素数标记为1
for(i=2;i<N;i++)
{
if(!a[i])
{
for(j=i+i;j<N;j=j+i)
{
a[j]=1;
}
}
}
for(i=2;i*i<N;i++)
{
for(j=i+1;j<=N/i;j++)
b[i*j]=(!a[i]&&!a[j]);
}
for(i=1;i<N;i++) b[i]+=b[i-1];
int k;
cin>>k;
while(k--)
{
int x,y;
cin>>x>>y;
cout<<b[y]-b[x-1]<<endl;
}
return 0;
}