blob: 46c858492129f679cfd40e582a434410679975bf (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
constexpr ll cache = 500; // requires O(cache^3)
vector<vector<ll>> memo(cache * cache, vector<ll>(cache));
ll pi(ll n);
ll phi(ll n, ll k) {
if (n <= 1 || k < 0) return 0;
if (n <= primes[k]) return n - 1;
if (n < N && primes[k] * primes[k] > n) return n - pi(n) + k;
bool ok = n < cache * cache;
if (ok && memo[n][k] > 0) return memo[n][k];
ll res = n/primes[k] - phi(n/primes[k], k - 1) + phi(n, k - 1);
if (ok) memo[n][k] = res;
return res;
}
ll pi(ll n) {
if (n < N) { // implement this as O(1) lookup for speedup!
return distance(primes.begin(), upper_bound(all(primes), n));
} else {
ll k = pi(sqrtl(n) + 1);
return n - phi(n, k) + k;
}}
|