Project Euler 625
Project Euler 625
题目
Gcd sum
\(G(N)=\sum_{j=1}^N\sum_{i=1}^j \text{gcd}(i,j)\).
You are given: \(G(10)=122\).
Find \(G(10^{11})\). Give your answer modulo \(998244353\).
解决方案
令\(\Phi(n)=\sum_{i=1}^n\varphi(n)\),其中\(\varphi\)为欧拉函数。
\[\begin{aligned} G(N)&=\sum_{j=1}^N\sum_{i=1}^j \text{gcd}(i,j)=\sum_{g=1}^Ng\sum_{j=1}^N\sum_{i=1}^j[\gcd(i,j)=g] \\ &=\sum_{g=1}^Ng\sum_{j=1}^N\sum_{i=1}^j[\gcd(i,j)=g] \\ &=\sum_{g=1}^Ng\sum_{j=1}^{\left\lfloor\frac{N}{g}\right\rfloor}\sum_{i=1}^j[\gcd(i,j)=1]\\ &=\sum_{g=1}^Ng\sum_{j=1}^{\left\lfloor\frac{N}{g}\right\rfloor}\varphi(i)\\ &=\sum_{g=1}^Ng\Phi\left(\dfrac{N}{g}\right) \end{aligned}\]
其中,\([]\)表示示性函数,表示\([]\)里面的值是否为真,如果为真,那么值为\(1\),否则值为\(0\).
这启发我们使用数论分块进行解决。考虑两层嵌套的数论分块,外层的计算\(g(n)\)的值,内层的计算\(\Phi(n)\)的值。
那么现在的问题就是使用数论分块的方法高效计算\(\Phi(n)\)的值。
\[\begin{aligned} \dfrac{n(n+1)}{2}&=|\{(a,b)|1\le a\le b \le n\}|\\ &=\sum_{d=1}^n|\{(a,b)|1\le a\le b \le n,\gcd(a,b)=d\}|\\ &=\sum_{d=1}^n\left|\left\{(a,b)| 1\le a\le b \le \left\lfloor\dfrac{n}{d}\right\rfloor,\gcd(a,b)=1\right\}\right|\\ &=\sum_{d=1}^n\Phi\left(\dfrac{n}{d}\right) \end{aligned}\]
因此,可以得到关于\(\Phi\)的递归式:
\[\Phi(n)=\dfrac{n(n+1)}{2}-\sum_{d=2}^n\Phi\left(\dfrac{n}{d}\right)\]
代码
1 |
|