欧拉函数 例题
笔记链接:
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) 为左下角,(n−1,n−1) 为右上角。求以原点为一端点,某一格点为另一端点且不经过其他格点的线段条数。
1≤n≤4×104,当然本算法可以解决 1≤n≤106 的数据。再大就要杜教筛。
思路
显然,除 (1,0),(0,1),(1,1) 外,点 (x,y) 能作为线段的另一端点当且仅当 1≤x,y≤n,x=y 且 gcd(x,y)=1。
若 x>y,可将 x,y 交换,进而只需考虑 x<y 的情况,并将结果乘2。
而满足 1≤x<y 且 gcd(x,y)=1 的 x 的数量,就是 φ(y)。
故答案为 3+2∑i=2nφ(i)。
用线性筛求每个数的欧拉函数,再累加。时间复杂度为 O(n)。
注意省选题的特判:当 n=1 时,只有原点一个格点,没有满足要求的线段。
例2
题目
计算:
i=1∑nj=1∑ngcd(i,j)lcm(i,j)mod998244353
其中 1≤n≤105。
思路
令 d=gcd(i,j),则:
i=1∑nj=1∑ngcd(i,j)lcm(i,j)=i=1∑nj=1∑nd2ij=i=1∑nj=1∑ndi⋅dj
而 gcd(i/d,j/d)=1,
令 a=i/d,b=j/d,则 gcd(a,b)=1。我们可以枚举 a 与 b,再乘以每组数值对应出现的次数。
对于 a=b=1 的情况,出现了 n 次。总和为 n。
对于 a>b 的情况,确定了 a 以后,根据性质1,a⋅∑gcd(a,b)=1b=a⋅2aφ(a)=2a2φ(a)。出现了 ⌊an⌋ 次。总和为 ∑a=1n2a2φ(a)⋅⌊an⌋。
对于 a<b 的情况,将 a 和 b 交换,即为上一种情况,计算时乘以2。(与例1类似)
最终答案为:
n+a=1∑n⌊an⌋a2φ(a)
本题不需要整除分块,O(n) 累加即可,加的时候取模。
例3
目前笔者尚未找到应用性质4的问题,有待补充。