2020.7.8 --素数线性筛,欧拉函数模板
素数线性筛
const int maxn = 2e7; int n, m, prime[maxn], isnt_prime[maxn],tot; void get_prime(int n) { isnt_prime[0] = isnt_prime[1] = 1; for (int i = 2; i <= n; ++i) { //当前数是所有数小于n的数而不只是素数,这是欧拉筛与埃氏筛的区别 if (!isnt_prime[i]) prime[++tot] = i; for (int j = 1; j <= tot && i * prime[j] <= n; ++j) { //当前数乘上的素数为prime[j] isnt_prime[i * prime[j]] = 1; if (i % prime[j] == 0) break; } } }

线性欧拉筛 O(n)
ll euler[maxn]; void eul() { for (int i = 2; i < maxn; i++) { if (!euler[i]) for (int j = i; j < maxn; j += i) { if (!euler[j]) euler[j] = j; euler[j] = euler[j] / i * (i - 1); } } }
单一欧拉筛 O(sqrt(n))
ll eular(ll n) { ll ans = n; for(int i=2; i*i <= n; ++i) { if(n%i == 0) { ans = ans/i*(i-1); while(n%i == 0) n/=i; } } if(n > 1) ans = ans/n*(n-1); return ans; }
我看见 你

浙公网安备 33010602011771号