HeNeos blog

Josue H. @ JP Morgan Chase

HeNeos

← Back to all posts

SPOJ: GCDPRDSM

August 21, 2023

#spoj#algorithms#number-theory

Statement

In this problem, you will be given qq queries (1 \leq qq \leq 10000001000000). Each query will contain a single integer nn (11 \leq nn \leq 10000001000000).

For each query you have to output the following:

i=1nigcd(i,n) \sum_{i=1}^{n} i \gcd(i, n)

Solution

S=i=1nigcd(i,n)S=i=1niknkgcd(i/k,n/k)=1 S = \sum_{i=1}^{n} i \gcd(i, n)\\ S = \sum_{i=1}^{n} i \sum_{k\vert n} k \Big\vert \gcd(i/k, n/k) = 1 \Big\vert

Where kk is the gcd(i,n)\gcd(i, n). It means that knk\vert n and kik\vert i.

S=i=1niknkdnμ(d)dgcd(i/k,n/k)S=i=1niknkdnμ(d)di/kdn/kS=dnμ(d)knkdn/ki=1nidi/kS=dnμ(d)knkdn/kj=1n/kjkdj S = \sum_{i=1}^{n} i \sum_{k\vert n} k \sum_{d\vert n} \mu(d) \Big\vert d\vert \gcd(i/k, n/k) \Big\vert\\ S = \sum_{i=1}^{n} i \sum_{k\vert n} k \sum_{d\vert n} \mu(d) \Big\vert d\vert i/k \Big\vert \Big\vert d\vert n/k \Big\vert\\ S = \sum_{d\vert n} \mu(d) \sum_{k\vert n} k \Big\vert d\vert n/k \Big\vert \sum_{i=1}^{n} i \Big\vert d\vert i/k \Big\vert\\ S = \sum_{d\vert n} \mu(d) \sum_{k\vert n} k \Big\vert d\vert n/k \Big\vert \sum_{j=1}^{n/k} jk \Big\vert d\vert j \Big\vert

The last sum is easy to calculate because it's just the sum of multiples of dd up to n/kn/k.

S=dnμ(d)knk2dn/kdn/kd(n/kd+1)2S=dnμ(d)dkn(n/k)2dkk/d(k/d+1)2S=dnμ(d)dkddiv(n/d)(n/k)2k/d(k/d+1)2S=dnμ(d)/dkn/d(n/k)2k(k+1)2S=n2dnμ(d)kn/d(k+1)n/dkS=n2dnμ(d)(ndσ0(n/d)+σ1(n/d))S=n2(n+dnμ(n/d)dσ0(d)) S = \sum_{d\vert n} \mu(d) \sum_{k\vert n} k^{2} \Big\vert d\vert n/k \Big\vert d \frac{\frac{n/k}{d}(\frac{n/k}{d}+1)}{2}\\ S = \sum_{d\vert n} \mu(d) d \sum_{k\vert n} (n/k)^{2} \Big\vert d\vert k \Big\vert \frac{k/d(k/d+1)}{2}\\ S = \sum_{d\vert n} \mu(d) d \sum_{k\in d\,\mathrm{div}(n/d)} (n/k)^{2} \frac{k/d(k/d+1)}{2}\\ S = \sum_{d\vert n} \mu(d)/d \sum_{k\vert n/d} (n/k)^{2} \frac{k(k+1)}{2}\\ S = \frac{n}{2}\sum_{d\vert n} \mu(d) \sum_{k \vert n/d} (k+1)\frac{n/d}{k}\\ S = \frac{n}{2}\sum_{d\vert n} \mu(d) \Big(\frac{n}{d} \sigma_{0}(n/d) + \sigma_{1}(n/d)\Big)\\ S = \frac{n}{2} \Big(n +\sum_{d\vert n} \mu(n/d) d \sigma_{0}(d)\Big)