点击查看代码
typedef uint32_t u32;
typedef unsigned char uc;
const u32 R30[]={1,7,11,13,17,19,23,29};
const u32 BLK=17017;struct Node{ u32 p;u32 pos[8];
};vector<u32>prime;
vector<Node>node;template<typename F>
void pre(u32 n,F&&f){if(n<19)return;vector<bool>vis(n+1);for(u32 i=3;i*i<=n;i+=2){if(!vis[i]){for(u32 j=i*i;j<=n;j+=i*2) vis[j]=1;}}for(u32 i=19;i<=n;i+=2){if(!vis[i]) f(i);}
}void init(u32 n){prime.clear(),node.clear();for(u32 p:{2,3,5,7,11,13,17}){if(p<=n) prime.push_back(p);}if(n<=17)return;if(n<=BLK*30){pre(n,[&](u32 p){ prime.push_back(p);});return;}vector<uc>mask(BLK,255);for(u32 p:{7,11,13,17}){ for(int i=0;i<8;++i){u32 j=p;while(j%30!=R30[i]){j+=p<<1;}for(j/=30;j<BLK;j+=p){mask[j]&=~(1<<i);}}}const u32 sq=sqrt(n);pre(sq,[&](u32 p){Node t{p};for(int i=0;i<8;++i){u32 j=p*p;while(j%30!=R30[i]){j+=p<<1;}t.pos[i]=j/30;}node.push_back(t);});const u32 tot=(n+29)/30;vector<uc>buf(BLK);for(u32 l=0;l<tot;l+=BLK) {u32 r=min(l+BLK, tot);copy(mask.begin(),mask.end(),buf.begin());if(!l) buf[0]&=0xFE;for(auto&t:node){for(int i=0;i<8;++i) {u32&j=t.pos[i];while(j<r){if(j>=l){buf[j-l]&=~(1<<i);}j+=t.p;}}}for(u32 i=l;i<r;++i) {for(uc m=buf[i-l];m;m^=1<<__builtin_ctz(m)){u32 x=i*30+R30[__builtin_ctz(m)];if(x>n)break;prime.push_back(x);}}}while(!prime.empty()&&prime.back()>n)prime.pop_back();
}