【SDOI2013】项链

题目描述

问满足以下要求的项链数有多少,答案对 109+7 取模,共 T 组数据。

  • 项链由 n 颗珠子构成。
  • 每颗珠子为正三棱柱,每个侧面上都有一个正整数 x ,满足 x<m ,并且三个面上的数字的最大公约数为 1 。珠子被认为是相同的,当且仅当数字序列可以通过旋转或翻转相互得到。
  • 相邻两颗珠子不可以相同。
  • 两串项链假如可以通过旋转相互得到,那么是被认为是相同的。

n1014,m107,T10

分析

这道题结合了许多的数论知识。
首先题目可以大体上分为两个部分:不同的珠子数、不同的项链数。

Part 1

如何求不同的珠子数呢?
实际上珠子相当于一个三元组 (x,y,z) ,记不同珠子类型数为 ret
这里珠子的所有置换构成置换群 G ,那么根据 burnside 引理

ret=xGf(d)|G|
而通过暴力枚举 G 的元素,我们可以发现 G 中有 1 个置换由 3 个轮换组成, 3 个置换由 2 个轮换组成, 2 个置换由 1 个轮换组成。
那么问题就转化为了统计最大公约数为 1 的有序三元组、二元组及一元组数目。

以统计三元组为例:
考虑记 gn 表示最大公约数至少为 n 的三元组数目。
fn 表示最大公约数为 n 的三元组数目。

gn=n|dfd=(mn)3

由前面写过的文章中

然而这个形式不仅仅局限于此,考虑以下等式。
F(n)=n|df(d)
那么
f(n)=n|dμ(dn)F(d)
也是成立的。
我们不妨倒过来想,原来的莫比乌斯反演是约数的形式,那么此时变成了倍数的形式以后基本思想还是不变的,上面的式子还是挺容易理解的。

可以得到这里的

fn=n|dμ(dn)gd

特别的

f1=ni=1μ(i)gi

于是再通过上面 burnside 引理的式子就可以计算不同的珠子类型数了。
gi 是可以 O(1) 算的,重点是在于处理 μ

part 2

项链的旋转同构显然也构成了一个置换群 G ,且 |G|=n
记不同的珠子类型数为 p 。根据 polya 定理,不同的项链数 ans

ans=dGpf(d)|G|

其中 G 中的置换 f(k) ,其轮换数为 (n,k)
然而这里它存在对染色的限制:相邻的染色不能相同。
不妨记 h(n) 表示对 n 组轮换染色的方案数。那么就有

h(n)=(p1)h(n2)+(p2)h(n1)
矩阵乘法即可。

然而我们直接枚举 k ,每次都矩阵乘法显然是不行的。
考虑枚举 gcd ,原式就变成了

ngcd=1h(gcd)φ(ngcd)

因为 gcd 必然是 n 的约数,直接枚举约数, φ(ngcd) 也可以顺便统计出来。

时间复杂度 O(d(n)logn) ,其中 d(n) n 的约数个数。
空间复杂度 O(m)

你可能感兴趣的:(【SDOI2013】项链)