为了追求极致速度特来测试自己写的bitset,但总是略慢于STL太难受了,卡不动了,求帮忙。 这个是求优化的码
#include <bits/stdc++.h>
using namespace std;
template <int len>
class My_bitset{
private:
int *p;
int n;
public:
My_bitset(){
n=(len>>5)+5;
p=new int[n];
memset(p,0,n<<2);
}
~My_bitset(){delete []p;}
bool operator[](int x){
return p[(x+((1<<5)-1))>>5]&(1<<((x-1)&((1<<5)-1)));
}
void set(int x,bool k){
int y=1<<((x-1)&((1<<5)-1));
x=(x+((1<<5)-1))>>5;
if(k) p[x]|=y;
else p[x]&=~y;
}
};
My_bitset <100000005> f;
int n,T,k,ct,a[6000001];
void oula_prime(int n){
for(int i=2;i<=n;i++){
if(!f[i]) a[++ct]=i;
for(int j=1;j<=ct&&i*a[j]<=n;j++){
f.set(i*a[j],1);
if(i%a[j]==0) break;
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
cin>>n>>T;
oula_prime(n);
while(T--){
cin>>k;
cout<<a[k]<<"\n";
}
}
这个是可读性更强(当然更慢)的同义码:
#include <bits/stdc++.h>
using namespace std;
template <int len>
class My_bitset{
private:
int *p;
int n;
public:
My_bitset(){
n=(len>>5)+5;
p=new int[n];
memset(p,0,n<<2);
}
~My_bitset(){delete []p;}
bool operator[](int x){
int i=(((x-1)&31)+1);
x=(x+31)>>5;
return p[x]&(1<<i-1);
}
void set(int x,bool k){
int i=((x-1)&31)+1;
x=(x+31)>>5;
if(k) p[x]|=(1<<i-1);
else p[x]&=~(1<<i-1);
}
};
My_bitset <100000005> f;
int n,T,k,ct,a[6000001];
void oula_prime(int n){
for(int i=2;i<=n;i++){
if(!f[i]) a[++ct]=i;
for(int j=1;j<=ct&&i*a[j]<=n;j++){
f.set(i*a[j],1);
if(i%a[j]==0) break;
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
cin>>n>>T;
oula_prime(n);
while(T--){
cin>>k;
cout<<a[k]<<"\n";
}
}