求卡常
查看原帖
求卡常
709361
盐焗蛋楼主2024/3/8 21:32

为了追求极致速度特来测试自己写的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";
	}
}
2024/3/8 21:32
加载中...