筛选素数
筛选素数
普通筛法
埃拉托斯特尼筛法,这种筛法虽然很好,但是有些数会被重复访问,比如30,会被素数2、3、5访问
#define N 1000100#define LL long longint num[N], prim[N];int pn = 0;void table(){memset(num, -1, sizeof(num));for (int i = 2; i < N; i++)if (num[i]) {prim[pn++] = i;for (LL j = 1LL*i*i; j < N; j += i)if (num[j])num[j] = 0;}}
欧拉筛
这个筛法做到了去除重复访问,原理是 if (i % prim[j] == 0) break; 做到每个数只被最小质因数访问。
#define N 100100000#define LL long longint num[N], prim[N];int pn = 0;void table(){memset(num, 0, sizeof(num));for (int i = 2; i < N; i++) {if (!num[i])prim[pn++] = i;for (int j = 0; j < pn && 1LL* i * prim[j] <= N; j++){num[i * prim[j]] = 1;if (i % prim[j] == 0) break;}}}
