牛逼的素数优化,求区间内的素数个数
int m,k,w,n,t; int prime[maxn],vis[maxn],sum[maxn];
int minPrim[maxn];
void Prime() { minPrim[1] = 1ll; for (int i=2; i< maxn; i++)minPrim[i] = i; for (int i=4; i< maxn; i+=2)minPrim[i] = 2; for (int i=3; i * i < maxn; i++) { if (minPrim[i] == i) { for (ll j = i * i; j< maxn; j += i) if (minPrim[j]==j) minPrim[j] = i; } } }//这个求的是当前素数的最小素数因子
void init() { memset(prime,0,sizeof prime); prime[1]=0; prime[2]=1; prime[3]=1; for(int i=4; i<=5000010; i++) { prime[i]=prime[i/minPrim[i]]+1; }//这里就能求出当前素数因子所有的素数因子个数了 sum[0]=0; for(int i=1; i<=5000010; i++) { sum[i]=prime[i]+sum[i-1]; }//前缀和优化一下 } signed main() { Prime(); init(); t=rd(); while(t--) { int b=rd(),a=rd(); printf("%lld\n",sum[b]-sum[a]); } return 0; }
放一个求素数的板子,求n到m之间的所有素数的因子的个数,比如2~6之间素数因子个数就有6个。

浙公网安备 33010602011771号