素数筛法
int m = sqrt(n + 0.5); memset(vis, 0, sizeof(vis)); for(int i = 2; i <= m; i++) if(!vis[i]) for(int j = i * i; j <= n; j += i) vis[j] = 1;
上述算法已经很高效了而且便于编写,如果还想进一步加速也可以使用线性筛
int pri[N], tot, np[N]; void sieve() { np[1] = 1; for (int i = 2; i <= n; i++) { if (!np[i]) pri[++tot] = i; for (int j = 1; j <= tot && i * pri[j] <= n; j++) { np[i * pri[j]] = 1; if (i % pri[j] == 0) break; } } }

浙公网安备 33010602011771号