神仙题目
给定(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}-lfloorfrac{k^lx}{y} floor=frac{x}{y}-lfloorfrac{x}{y} floor)
两边同乘一个(y)得(k^lx-lfloorfrac{k^lx}{y} floor y=x-lfloorfrac{x}{y} floor 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)
问题就变为了,求
这个(i⊥j)显然可以反演
我们变为枚举(d)
我们把(d)提出来,但是记得(d)也要和(k)互质
(i)没用了,化简掉
此时我们设(S(n,k)=sumlimits_{i=1}^{n}mu(i)[gcd(i,k)==1],f(n)=sumlimits_{i=1}^{n}[gcd(i,k)==1])
只要快速算出特殊点处(S(n))和(f(n))的值,就可以除法分块了
先来考虑(f(n))怎么求
由于(gcd(i,k)==gcd(i+k,k)),所以(f(n)=f(k)*lfloorfrac{n}{k} floor+f(n\%k))预处理出(n≤k)的(f(n))就可以(O(1))计算了
然后是(S(n,k)),它等于(sumlimits_{i=1}^{n}mu(i)[gcd(i,k)==1])
反演一下(S(n,k)=sumlimits_{i=1}^{n}mu(i)sumlimits_{d|i,d|k}mu(d))
优先枚举(d),得到(S(n,k)=sumlimits_{d|k}mu(d)sumlimits_{d|i}mu(i))
将后面改为枚举倍数(S(n,k)=sumlimits_{d|k}mu(d)sumlimits_{i=1}^{lfloorfrac{n}{d} floor}mu(id))
根据莫比乌斯函数性质,当且仅当(i⊥d)时(mu(id))不为(0),所以(S(n,k)=sumlimits_{d|k}mu(d)^2sumlimits_{i=1}^{lfloorfrac{n}{d} floor}mu(i)[i⊥d])
发现后面这个其实就是(S(lfloorfrac{n}{d} floor,d)),那么就可以递归求解了
但是递归边界(d=1)时怎么办呢
(S(n,1)=sumlimits_{i=1}^{n}mu(i)[gcd(i,1)==1]=sumlimits_{i=1}^{n}mu(i)),这不就是杜教筛吗!
那么
就可以除法分块解决了
然而我又发现了一种更神仙地求(S(n,k))的方法!
设(g(n)=[gcd(n,k)==1],S(n)=sumlimits_{i=1}^{n}mu(i)g(i))
那么(sumlimits_{i=1}^{n}g(i)*S(lfloorfrac{n}{i}
floor)=sumlimits_{i=1}^{n} sumlimits_{j=1}^{lfloorfrac{n}{i}
floor}g(i)mu(j)g(j))
设(d=i*j)
(=sumlimits_{d=1}^{n}sumlimits_{i|d}g(i)*mu(lfloorfrac{d}{i}
floor)*g(frac{d}{i}))
由于(g)是完全积性函数,所以(=sumlimits_{d=1}^{n}sumlimits_{i|d}*mu(lfloorfrac{d}{i} floor)*g(d))
又因为(mu*1=e),所以(=g(1)=1)
所以(S(n)=1-sumlimits_{i=2}^{n}g(i)*S(lfloorfrac{n}{i} floor))
我们发现(sumlimits_{i=1}^{n})就是(f(n)),所以可以直接杜教筛!