神仙题目
给定\(n,m\),求有多少数值上互补相等的可以表示成\(\frac{x}{y}\)的数,满足\(1≤x≤n,1≤y≤m\),且\(\frac{x}{y}\)在\(k\)进制下是纯循环小数(特别地,整数也是纯循环小数)
\(1≤n,m≤10^9,2≤k≤2000\)
首先要求数值上互补相等,即要求\(x⊥y\)
又要满足纯循环小数,假设循环节长为\(l\),那么\(\frac{k^lx}{y}-\lfloor\frac{k^lx}{y}\rfloor=\frac{x}{y}-\lfloor\frac{x}{y}\rfloor\)
两边同乘一个\(y\)得\(k^lx-\lfloor\frac{k^lx}{y}\rfloor y=x-\lfloor\frac{x}{y}\rfloor y\)
在膜法作用下\(k^lx≡x mod y\)
又因为\(x⊥y\),所以\(k^l≡1 mod y\)
此时我们假设\(gcd(k,y)=d\),那么\(k=k_1d,y=k_2d\)
\(k_1^ld^l≡1 mod y\)
所以\(k_2d|(k_1^ld^l-1)\)
又因为\(k_1⊥k_2\),所以\(d|(k_1^ld^l-1)\)
此时说明右边等于\(k_3d\),得出\(1\)是\(d\)的倍数
所以\(y⊥k\)
问题就变为了,求
\[\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[i⊥j][j⊥k]\]
这个\(i⊥j\)显然可以反演
\[\sum\limits_{j=1}^{n}[j⊥k]\sum\limits_{i=1}^{m}\sum\limits_{d|i,d|j}\mu(d)\]
我们变为枚举\(d\)
\[\sum\limits_{d=1}^{n}\mu(d)\sum\limits_{d|i}\sum\limits_{d|j}[gcd(j,k)==1]\]
我们把\(d\)提出来,但是记得\(d\)也要和\(k\)互质
\[\sum\limits_{d=1}^{n}[gcd(d,k)==1]\mu(d)\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{d}\rfloor}[gcd(j,k)==1]\]
\(i\)没用了,化简掉
\[\sum\limits_{d=1}^{n}[gcd(d,k)==1]\mu(d)\lfloor\frac{n}{d}\rfloor\sum\limits_{j=1}^{\lfloor\frac{m}{d}\rfloor}[gcd(j,k)==1]\]
此时我们设\(S(n,k)=\sum\limits_{i=1}^{n}\mu(i)[gcd(i,k)==1],f(n)=\sum\limits_{i=1}^{n}[gcd(i,k)==1]\)
\[\sum\limits_{d=1}^{n}[gcd(d,k)==1]\mu(d)\lfloor\frac{n}{d}\rfloor f(\lfloor\frac{m}{d}\rfloor)\]
只要快速算出特殊点处\(S(n)\)和\(f(n)\)的值,就可以除法分块了
先来考虑\(f(n)\)怎么求
由于\(gcd(i,k)==gcd(i+k,k)\),所以\(f(n)=f(k)*\lfloor\frac{n}{k}\rfloor+f(n\%k)\)预处理出\(n≤k\)的f(n)就可以\(O(1)\)计算了
然后是\(S(n,k)\),它等于\(\sum\limits_{i=1}^{n}\mu(i)[gcd(i,k)==1]\)
反演一下\(S(n,k)=\sum\limits_{i=1}^{n}\mu(i)\sum\limits_{d|i,d|k}\mu(d)\)
优先枚举\(d\),得到\(S(n,k)=\sum\limits_{d|k}\mu(d)\sum\limits_{d|i}\mu(i)\)
将后面改为枚举倍数\(S(n,k)=\sum\limits_{d|k}\mu(d)\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor}\mu(id)\)
根据莫比乌斯函数性质,当且仅当\(i⊥d\)时\(\mu(id)\)不为\(0\),所以\(S(n,k)=\sum\limits_{d|k}\mu(d)^2\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor}\mu(i)[i⊥d]\)
发现后面这个其实就是\(S(\lfloor\frac{n}{d}\rfloor,d)\),那么就可以递归求解了
但是递归边界\(d=1\)时怎么办呢
\(S(n,1)=\sum\limits_{i=1}^{n}\mu(i)[gcd(i,1)==1]=\sum\limits_{i=1}^{n}\mu(i)\),这不就是杜教筛吗!
那么
\[\sum\limits_{d=1}^{n}[gcd(d,k)==1]\mu(d)\lfloor\frac{n}{d}\rfloor f(\lfloor\frac{m}{d}\rfloor)\]
就可以除法分块解决了