题目简意
题目给出t组数据,每一组数据包含一个正整数x,问有多少个比x
小的非负整数y使得x⊕y
解题思路
假设对5进行分析:
首先把5拆成二进制下的101
则把y=0,1,2,3,4分别代入x⊕y得到101 100 111 110 001
我们可以发现答案落在两个区间内 100-111 和 000-001
这就为解题提供了思路:
对于x在二进制下的每一个1(设为k),计算出其对应区间~
的质数个数,逐个相加得到答案。
代码
#include<bits/stdc++.h>
using namespace std ;
vector<int> p;
bool p2[4000007];
void prime(){
for(int i=2;i<20334;i++){
if(p2[i])continue;
bool flag=0;
for(auto &j:p){
if(i%j==0){
flag=1;
break;
}
}int sum=i;
p2[i]=flag;
if(!flag)p.push_back(i);
while(sum<=3000002){
sum+=i;
p2[sum]=1;
}
}
for(int i=20334;i<300002;i++){
if(!p2[i])p.push_back(i);
}
}
vector<bitset<21> > b;
int main(){
prime();
int tmp[21]={0};
int a=1;
for(int i=0,j=0;i<=20;i++){
a*=2;
while(j<p.size()&&p[j]<a)j++,tmp[i]++;
}
int t;
cin>>t;
for(int i=0;i<t;i++){int ans=0;
int a;
cin>>a;
b.push_back(bitset<21>(a));
for(int j=0;j<20;j++){
if(b[i][j])ans+=tmp[j];
}cout<<ans<<endl;
}
//int x=1;
return 0;
}