--- id: multiplicative title: "Prefix Sums of Multiplicative Functions" author: Benjamin Qi description: "?" frequency: 0 --- https://codeforces.com/blog/entry/54150 ## Linear Time Sieve https://judge.yosupo.jp/problem/enumerate_primes ## Counting Primes https://judge.yosupo.jp/problem/counting_primes ## Totient Function https://judge.yosupo.jp/problem/sum_of_totient_function ```cpp template struct Sieve { vi pr; int sp[SZ], phi[SZ]; // smallest prime that divides Sieve() { // above is faster memset(sp,0,sizeof sp); phi[1] = 1; FOR(i,2,SZ) { if (sp[i] == 0) { sp[i] = i, pr.pb(i); phi[i] = i-1; } trav(p,pr) { if (p > sp[i] || i*p >= SZ) break; sp[i*p] = p; phi[i*p] = (p == sp[i] ? p : p-1)*phi[i]; } } } }; const int HI = 5000000; Sieve S; ll N; vmi small(HI), big; int main() { setIO(); re(N); big.rsz(N/HI+2); FOR(i,1,HI) small[i] = small[i-1]+S.phi[i]; ROF(i,1,sz(big)) { ll mx = N/i; big[i] = mi(mx)*(mx+1)/2; // dbg("HUH",i,big[i]); for (ll fac = 2, nex; fac <= mx; fac = nex) { ll quo = mx/fac; nex = mx/quo+1; big[i] -= (nex-fac)*(quo < HI ? small[quo] : big[i*fac]); } } ps(big[1]); } ``` (project euler) (topcoder problem)