【模板】欧拉筛法(线性筛法)

 1 int n;
 2 int p[MAX_N], cnt;
 3 bool b[MAX_N];
 4  
 5 void Euler()
 6 {
 7     b[0] = b[1] = 1;
 8     for(register int i = 2; i <= n; ++i)
 9     {
10         if(!b[i]) p[cnt++] = i;
11         for(register int j = 0; i * p[j] <= n; ++j)
12                 // 不需要判断j < cnt, 因为中途定然会break出去
13         {
14             b[i * p[j]] = 1;
15             if(!(i % p[j])) break;
16                 // 当出现这种情况时, i * p[j + k(k > 0, j + k < cnt)]的情况一定会被后面给筛掉
17         }
18     }
19     return;
20 }

猜你喜欢

转载自www.cnblogs.com/kcn999/p/10015332.html