[题解] LuoguP1587 [NOI2016]循环之美

https://www.luogu.com.cn/problem/P1587

神仙题...

首先我们只要考虑所有最简分数就好了,也就是((a,b)=1)(frac{a}{b})

然后答案就是

(sumlimits_{i=1}^n sumlimits_{j=1}^m [gcd(i,j)=1)(frac{i}{j})(k)进制下是纯循环小数(])

(下面令({ x})表示(x)的小数部分)

考虑一个最简分数(frac{x}{y}),它的小数部分({ x/y})显然是((x mod y)/y)

注意到(k)进制下将一个数左移一位相当于乘一个(k),设分数(x/y)循环节的长度为(r),那么必然有

(k^r x mod y = x mod y)

由于((x,y)=1),两边同时乘一个(x^{-1})可得

(k^r equiv 1 pmod y)

也就是存在整数(r,q)(r>0)),满足(k^r - qy=1)

((k^r,y)=1),发现这个成立当且仅当((k,y)=1)

然后就可以推柿子辣

[egin{aligned}Ans&=sumlimits_{i=1}^n sumlimits_{j=1}^m [gcd(i,j)=1][gcd(j,k)=1]\&=sumlimits_{j=1}^m[gcd(j,k)=1]sumlimits_{i=1}^n [gcd(i,j)=1]\&=sumlimits_{j=1}^m[gcd(j,k)=1]sumlimits_{i=1}^n sumlimits_{d mid gcd} mu(d)\&=sumlimits_{d}mu(d)lfloorfrac{n}{d} floorsumlimits_{j=1}^{lfloor m/d floor} [gcd(jd,k)=1] end{aligned} ]

看后面那个(j),貌似不太好推了...

但注意到(gcd(jd,k)=1)等价于(gcd(j,k)=1)(gcd(d,k)=1),所以

[egin{aligned} Ans&=sumlimits_{d} mu(d)lfloorfrac{n}{d} floorsumlimits_{j=1}^{lfloor m/d floor} [gcd(j,k)=1][gcd(d,k)=1]\&=sumlimits_{d} lfloorfrac{n}{d} floormu(d)[gcd(d,k)=1]sumlimits_{j=1}^{lfloor m/d floor} [gcd(j,k)=1]end{aligned} ]

还是不太好做...但不要放弃梦想...

(f(n)=sum_{i=1}^n [gcd(i,k)=1])

(g(n,k)=sum_{i=1}^n mu(i)[gcd(i,k)=1])(这里为什么是(n,k)?往下看呗...)

如果能快速搞出这两个东西我们就能数论分块了...

先来看(f(n))

考虑两个数互质(a,b),写成带余除法的形式(a=bq+r)

由于(a,b)互质,所以(r,b)也必须互质(不然直接提个公因子出来,与((a,b)=1)矛盾)。

所以((a,b)=1)等价于((a mod b,b)=1),那么(f)也很显然啦,每(k)个数是一个循环,所以

(f(n)=lfloorfrac{n}{k} floor f(k) + f(n mod k))

暴力算出(f(0...k))即可

然后是(g(n,k))

中间又有个(gcd)?我们推一波柿子

[egin{aligned} g(n,k)&=sumlimits_{i=1}^n mu(i)sumlimits_{d mid i ext{且} dmid k} mu(d)\&=sumlimits_{d mid k} mu(d) sumlimits_{i=1}^{lfloorfrac{n}{d} floor} mu(id)end{aligned} ]

后面有个(id)...然后又不会了...

注意到(mu)是一个积性函数对于(gcd(a,b)=1),有(mu(ab)=mu(a)mu(b)),如果(a,b)不互质呢,根据莫比乌斯函数的定义,显然(mu(ab)=0)

于是

[egin{aligned}g(n,k)&=sumlimits_{dmid k} mu(d) sumlimits_{i=1}^{lfloorfrac{n}{d} floor} mu(d)mu(i)[gcd(i,d)=1]\&=sumlimits_{d mid k} mu(d)^2 sumlimits_{i=1}^{lfloorfrac{n}{d} floor}[gcd(i,d)=1]mu(i)end{aligned} ]

你看看后面那一坨...

不就是(g(lfloorfrac{n}{d} floor,d))嘛!

没想到吧...

然后(g(n,k)=sum_{dmid k} mu(d)^2 g(lfloor n/d floor,d))

边界情况就是(g(n,1)=sum_{i=1}^n mu(i)),这种直接杜教筛就好了

然后就做完了...

复杂度不会算...

被卡的话算(g)的时候注意特判一下(mu(d)=0)就不用递归了

跑的贼慢的(Code): https://paste.ubuntu.com/p/GhbXXnVXmJ/

原文地址:https://www.cnblogs.com/wxq1229/p/12814329.html