洛谷P1587 [NOI2016]循环之美

神仙题目

给定\(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)\]
就可以除法分块解决了

然而我又发现了一种更神仙地求\(S(n,k)\)的方法!

\(g(n)=[gcd(n,k)==1],S(n)=\sum\limits_{i=1}^{n}\mu(i)g(i)\)

那么\(\sum\limits_{i=1}^{n}g(i)*S(\lfloor\frac{n}{i}\rfloor)=\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{\lfloor\frac{n}{i}\rfloor}g(i)\mu(j)g(j)\)
\(d=i*j\)
\(=\sum\limits_{d=1}^{n}\sum\limits_{i|d}g(i)*\mu(\lfloor\frac{d}{i}\rfloor)*g(\frac{d}{i})\)

由于\(g\)是完全积性函数,所以\(=\sum\limits_{d=1}^{n}\sum\limits_{i|d}*\mu(\lfloor\frac{d}{i}\rfloor)*g(d)\)

又因为\(\mu*1=e\),所以\(=g(1)=1\)

所以\(S(n)=1-\sum\limits_{i=2}^{n}g(i)*S(\lfloor\frac{n}{i}\rfloor)\)

我们发现\(\sum\limits_{i=1}^{n}\)就是\(f(n)\),所以可以直接杜教筛!

猜你喜欢

转载自www.cnblogs.com/knife-rose/p/12024490.html