【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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值