NOI2016 循环之美
首先要求数值互不相同,就相当于要求分子分母互质(不互质就会重复)
考虑怎么转化纯循环小数这个条件:
设 xy 循环节为 l 位,这意味着 xy 向左平移 l 位后,小数点后的部分不变,即:
xkl≡xmody
x,y 互质,因此只要 k,y 互质即可。
于是只需要求
n∑i=1m∑j=1[gcd(i,j)=1][gcd(j,k)=1]
=n∑i=1m∑j=1[gcd(i,j)=1][gcd(j,k)=1]=m∑j=1[gcd(j,k)=1]n∑i=1∑d|gcd(i,j)μ(d)=n∑d=1[gcd(d,k)=1]μ(d)m/d∑j=1n/d∑i=1[gcd(j,k)=1]=n∑d=1[gcd(d,k)=1]μ(d)⌊nd⌋m/d∑j=1[gcd(j,k)=1]
这里可以整除分块了,考虑分别计算:
f(x)=x∑i=1[gcd(i,k)=1]g(x,k)=x∑i=1[gcd(i,k)=1]μ(i)
注意到 k 非常小,因此 gcd(i,k)=gcd(imodk,k),我们只需要对 1∼k 中每个数 x 维护 g(x) 表示 ≤ 该数的数中与 k 互质的数的个数。再维护一个 g(x) 的前缀和即可 O(1) 求解单个 f。
但是 g 不行,因为 μ(i)≠μ(i+k),两者的关系很复杂。
g(x,k)=x∑i=1[gcd(i,k)=1]μ(i)=x∑i=1μ(i)∑d|gcd(i,k)μ(d)=x∑d|kμ(d)x/d∑i=1μ(id)
若 gcd(i,d)≠1 则 μ(id)=0,对答案没有贡献,因此当 gcd(i,d)=1,可以积性函数展开后面的 μ。
g(x,k)=x∑d|kμ2(d)x/d∑i=1μ(i)[gcd(i,d)=1]=x∑d|kμ2(d)g(xd,d)
于是可以递归求解所有的 g,初始值 g(x,1)=∑xi=1μ(i) 杜教筛即可。
复杂度 O(√nσ0(k)+n23)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2022-06-06 2022.6.2 联训