[NOI2016] 循环之美
NOI2016 循环之美
首先要求数值互不相同,就相当于要求分子分母互质(不互质就会重复)
考虑怎么转化纯循环小数这个条件:
设 \(\frac{x}{y}\) 循环节为 \(l\) 位,这意味着 \(\frac{x}{y}\) 向左平移 \(l\) 位后,小数点后的部分不变,即:
\[xk^l\equiv x\bmod y
\]
\(x,y\) 互质,因此只要 \(k,y\) 互质即可。
于是只需要求
\[\sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j)=1][\gcd(j,k)=1]
\]
\[\begin{aligned}
&=\sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j)=1][\gcd(j,k)=1]\\
&=\sum_{j=1}^{m}[\gcd(j,k)=1]\sum_{i=1}^{n}\sum_{d|\gcd(i,j)}\mu(d)\\
&=\sum_{d=1}^{n}[\gcd(d,k)=1]\mu(d)\sum_{j=1}^{m/d}\sum_{i=1}^{n/d}[\gcd(j,k)=1]\\
&=\sum_{d=1}^{n}[\gcd(d,k)=1]\mu(d)\lfloor\dfrac{n}{d}\rfloor\sum_{j=1}^{m/d}[\gcd(j,k)=1]
\end{aligned}
\]
这里可以整除分块了,考虑分别计算:
\[f(x)=\sum_{i=1}^{x}[\gcd(i,k)=1]\\
g(x,k)=\sum_{i=1}^{x}[\gcd(i,k)=1]\mu(i)
\]
注意到 \(k\) 非常小,因此 \(\gcd(i,k)=\gcd(i\bmod k,k)\),我们只需要对 \(1\sim k\) 中每个数 \(x\) 维护 \(g(x)\) 表示 $\le $ 该数的数中与 \(k\) 互质的数的个数。再维护一个 \(g(x)\) 的前缀和即可 \(\mathcal O(1)\) 求解单个 \(f\)。
但是 \(g\) 不行,因为 \(\mu(i)\not=\mu(i+k)\),两者的关系很复杂。
\[\begin{aligned}
g(x,k)&=\sum_{i=1}^{x}[\gcd(i,k)=1]\mu(i)\\
&=\sum_{i=1}^{x}\mu(i)\sum_{d|\gcd(i,k)}\mu(d)\\
&=\sum_{d|k}^{x}\mu(d)\sum_{i=1}^{x/d}\mu(id)\\
\end{aligned}
\]
若 \(\gcd(i,d)\not=1\) 则 \(\mu(id)=0\),对答案没有贡献,因此当 \(gcd(i,d)=1\),可以积性函数展开后面的 \(\mu\)。
\[\begin{aligned}
g(x,k)&=\sum_{d|k}^{x}\mu^2(d)\sum_{i=1}^{x/d}\mu(i)[\gcd(i,d)=1]\\
&=\sum_{d|k}^{x}\mu^2(d)g(\frac{x}{d},d)\\
\end{aligned}
\]
于是可以递归求解所有的 \(g\),初始值 \(g(x,1)=\sum_{i=1}^{x}\mu(i)\) 杜教筛即可。
复杂度 \(\mathcal O(\sqrt{n}\sigma_0(k)+n^{\frac{2}{3}})\)