求区间[L,R]素数个数:
欧拉筛筛出来,二分查找R,L的位置,相减即可。
要想这些素数子区间中&和为0,必然左端点包含2(只有2是偶数,二进位的右往左第一位为0,才可能使得结果为零,实际上含2,3,5的区间都为0)。
#include<bits/stdc++.h>
using namespace std;
const int N=1e8+2;
bool np[N];
vector<int>p;
void prime()
{
for(int i=2;i<=1e8;i++)
{
if(!np[i]) p.push_back(i);
for(auto it:p)
{
if(it*i>1e8) break;
np[i*it]=true;
if(i%it==0) break;
}
}
}
int main()
{
prime();
int t; cin>>t;
while(t--)
{
int ans=0;
int l,r; cin>>l>>r;
int sum=upper_bound(begin(p),end(p),r)-lower_bound(begin(p),end(p),l);
cout<<sum<<' ';
if(l>2) ans=0;
else{
if(r>=5)
ans=sum-2;
}
cout<<ans<<endl;
}
}
24/8/8