推歌:世界は可愛く出来ている
东方兽王园的灵梦新曲,还挺可爱的 .
看 PinkRabbit 数论课件有这个建立递归关系的 Trick(什么,你的课件都是从小学数学讲到 NOI 的吗).
问题:计算 \(\displaystyle\sum_{i=1}^n\mu(i)[i\perp k]\) .
令 \(\displaystyle F(n,k)=\sum_{i=1}^n\mu(i)[i\perp k]\),则可以建立递归关系:
\[\begin{aligned}F(n,k)&=\sum_{i=1}^n[i\perp k]\mu(i)\\&=\sum_{i=1}^n\mu(i)\sum_{d\mid\gcd(i,k)}\mu(d)\\&=\sum_{d\mid k}\mu(d)\sum_{i=1}^{\lfloor\frac nd\rfloor}\mu(id)\\&=\sum_{d\mid k}\mu(d)\sum_{i=1}^{\lfloor\frac nd\rfloor}\mu(i)\mu(d)[i\perp d]\\&=\sum_{d\mid k}\mu(d)^2F\left(\left\lfloor\dfrac nd\right\rfloor,d\right)\end{aligned}
\]
那么递归即可 . 有用的 \(d\) 肯定是 square-free 的,那么只有 \(2^{\omega(d)}\) 种 .
可以看成 DAG 上 \(1\to n\) 所有路径点权积之和,而只有 \(1\) 的点权和 \(n\) 有关 . 所以如果 \(k\) 不变的话,可以处理出 \(F(k,k)\) 之后 \(\Theta(1)\) 得到别的位置的答案 .
推广路线 1:使用完全一致的推导过程,不过 \(\mu\) 改成了 \(\varphi\)(其中 \(\varphi^{-1}\) 是 \(\dfrac1{\varphi(x)}\),不是 Dirichlet 卷积逆):
\[\begin{aligned}F(n,k)&=\sum_{i=1}^n\varphi(i)\dfrac{\gcd(i,k)}{\varphi(\gcd(i,k))}\\&=\sum_{i=1}^n\varphi(i)\sum_{d\mid\gcd(i,k)}(\varphi^{-1}*\mu)(d)\\&=\sum_{d\mid k}(\varphi^{-1}*\mu)(d)\sum_{i=1}^{\lfloor\frac nd\rfloor}\varphi(di)\\&=\sum_{d\mid k}\varphi(d)(\varphi^{-1}*\mu)(d)\sum_{i=1}^{\lfloor\frac nd\rfloor}\dfrac{\varphi(i)\gcd(i,d)}{\varphi(\gcd(i,d))}\\&=\sum_{d\mid k}\varphi(d)(\varphi^{-1}*\mu)(d)F\left(\left\lfloor\dfrac nd\right\rfloor,d\right)\end{aligned}
\]
推广路线 2:改成二维的:
\[\begin{aligned}F(n,m,k)&=\sum_{i=1}^n\sum_{j=1}^m[i\perp j][j\perp k]\\&=\sum_{i=1}^n[i\perp j]\sum_{j=1}^m\sum_{d\mid\gcd(j,k)}\mu(d)\\&=\sum_{i=1}^n\sum_{d\mid k}\mu(d)\sum_{j=1}^{\lfloor\frac md\rfloor}[i\perp jd]\\&=\sum_{d\mid k}\mu(d)\sum_{i=1}^n\sum_{j=1}^{\lfloor\frac md\rfloor}[i\perp j][i\perp d]\\&=\sum_{d\mid k}\mu(d)F\left(\left\lfloor\dfrac md\right\rfloor,n,d\right)\end{aligned}
\]
(感觉这个推导非常科幻……怎么想出来这么厉害的东西的)
应用:NOI2016 循环之美(其实就是推广路线 2).
题解(大众解法)
假设 \(n,m\) 同阶 .
额首先既约既约分数 \(\dfrac xy\) 在 \(k\) 进制下纯循环当且仅当 \(y\perp k\) .
因为如果循环节长度是 \(c\) 那么肯定有 \(x\equiv x\cdot k^c\pmod y\),又因为 \(x\perp y\) 那么就是 \(k^c\equiv 1\pmod y\),所以只有 \(y\perp k\) 的时候才有满足条件的 \(c\),这样就证明了结论 .
于是答案就是 \(\displaystyle \sum_{i=1}^n\sum_{j=1}^m[i\perp j][j\perp k]\),化简一下:
\[\begin{aligned}\sum_{i=1}^n\sum_{j=1}^m[i\perp j][j\perp k]&=\sum_{i=1}^m[i\perp k]\sum_{j=1}^n[i\perp j]\\&=\sum_{d=1}^{\min\{n,m\}}[d\perp k]\mu(d)\sum_{i=1}^{\lfloor\frac nd\rfloor}\sum_{i=1}^{\lfloor\frac md\rfloor}[j\perp k]\\&=\sum_{d=1}^{\min\{n,m\}}[d\perp k]\mu(d)\left\lfloor\dfrac nd\right\rfloor\sum_{j=1}^{\lfloor\frac md\rfloor}[j\perp k]\end{aligned}
\]
那么整除分块后就是要求:
\[\begin{aligned}&f(n,k)=\sum_{i=1}^n[i\perp k]\\&g(n,k)=\sum_{i=1}^n[i\perp k]\mu(i)\end{aligned}
\]
分别看一下:
\[\begin{aligned}f(n,k)&=\sum_{i=1}^n[i\perp k]\\&=\sum_{i=1}^n[i\bmod k\perp k]\\&=\left\lfloor\dfrac nk\right\rfloor f(k,k)+f(n\bmod k,k)\\g(n,k)&=\sum_{i=1}^n[i\perp k]\mu(i)\\&=\sum_{i=1}^n\mu(i)\sum_{d\mid\gcd(i,k)}\mu(d)\\&=\sum_{d\mid k}\mu(d)\sum_{i=1}^{\lfloor\frac nd\rfloor}\mu(id)\\&=\sum_{d\mid k}\mu(d)\sum_{i=1}^{\lfloor\frac nd\rfloor}\mu(i)\mu(d)[i\perp d]\\&=\sum_{d\mid k}\mu(d)^2g\left(\left\lfloor\dfrac nd\right\rfloor,d\right)\end{aligned}
\]
这样对于 \(f\) 来说因为 \(k\le 2000\) 所以预处理出小的 \(f\) 之后就能算了 .
对于 \(g\) 来说暴力记忆化递归算,因为外层有整除分块所以复杂度不太好分析 . 毛估估一下的话如果光看递归树大小涉及到的不同状态的数量是 \(O(\omega(k)\sqrt n)\) 级别的,底层 \(k=1\) 的块筛部分用杜教筛的话时间复杂度就是 \(O(n^{2/3})\) . 那么可以得到一个时间复杂度的上界是 \(O(\omega(k)\log n+n^{2/3})\) .
那么整合一下的话时间复杂度就是 \(O(k+n^{2/3}+\omega(k)\log n)\),可以通过 .
(我写的没有那么精细,算 \(g\) 是 \(O(n^{2/3}+\sqrt k\log n)\) 的也过了)
感觉也不是很麻烦为什么最后渲染出来这么长