欧拉函数 例题

笔记链接:

https://blog.nowcoder.net/n/d5d1b02f6b3945ad9283d29c41ee1632

例1 仪仗队 / Visible Lattice Points

https://ac.nowcoder.com/acm/problem/20313 - 单测

https://ac.nowcoder.com/acm/problem/51045 - 多测

经典题目。

题意

在网格中,原点 (0,0)(0, 0) 为左下角,(n1,n1)(n-1, n-1) 为右上角。求以原点为一端点,某一格点为另一端点且不经过其他格点的线段条数。

1n4×1041 \le n \le 4 \times 10^4,当然本算法可以解决 1n1061 \le n \le 10^6 的数据。再大就要杜教筛。

思路

显然,除 (1,0),(0,1),(1,1)(1,0), (0, 1), (1, 1) 外,点 (x,y)(x, y) 能作为线段的另一端点当且仅当 1x,yn1 \le x, y \le nxyx \ne ygcd(x,y)=1\gcd(x, y) = 1

x>yx > y,可将 xxyy 交换,进而只需考虑 x<yx < y 的情况,并将结果乘2。

而满足 1x<y1 \le x < ygcd(x,y)=1\gcd(x, y) = 1xx 的数量,就是 φ(y)\varphi(y)

故答案为 3+2i=2nφ(i)3 + 2\sum_{i=2}^n \varphi(i)

用线性筛求每个数的欧拉函数,再累加。时间复杂度为 O(n)O(n)

注意省选题的特判:当 n=1n = 1 时,只有原点一个格点,没有满足要求的线段。

例2

题目

计算:

i=1nj=1nlcm(i,j)gcd(i,j)mod998244353\sum_{i=1}^n \sum_{j=1}^n \frac{\mathrm{lcm}(i, j)}{\gcd(i, j)} \bmod 998244353

其中 1n1051 \le n \le 10^5

思路

d=gcd(i,j)d = \gcd(i, j),则:

i=1nj=1nlcm(i,j)gcd(i,j)=i=1nj=1nijd2=i=1nj=1nidjd \sum_{i=1}^n \sum_{j=1}^n \frac{\mathrm{lcm}(i, j)}{\gcd(i, j)} = \sum_{i=1}^n \sum_{j=1}^n \frac{ij}{d^2} = \sum_{i=1}^n \sum_{j=1}^n \frac id \cdot \frac jd

gcd(i/d,j/d)=1\gcd(i/d, j/d) = 1

a=i/da = i / db=j/db = j / d,则 gcd(a,b)=1\gcd(a, b) = 1。我们可以枚举 aabb,再乘以每组数值对应出现的次数。

对于 a=b=1a = b = 1 的情况,出现了 nn 次。总和为 nn

对于 a>ba > b 的情况,确定了 aa 以后,根据性质1,agcd(a,b)=1b=aaφ(a)2=a2φ(a)2a \cdot \sum_{\gcd(a,b) = 1} b = a \cdot \frac{a\varphi(a)}{2} = \frac{a^2\varphi(a)}{2}。出现了 na\left\lfloor \frac{n}{a} \right\rfloor 次。总和为 a=1na2φ(a)2na\sum_{a=1}^n \frac{a^2\varphi(a)}{2} \cdot \left\lfloor \frac{n}{a} \right\rfloor

对于 a<ba < b 的情况,将 aabb 交换,即为上一种情况,计算时乘以2。(与例1类似)

最终答案为:

n+a=1nnaa2φ(a)n + \sum_{a=1}^n \left\lfloor\frac na \right\rfloor a^2\varphi(a)

本题不需要整除分块,O(n)O(n) 累加即可,加的时候取模。

例3

目前笔者尚未找到应用性质4的问题,有待补充。