您的位置:首页 > 其它

【SDOI2013】项链

2016-02-24 09:02 127 查看

题目描述

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

项链由nn颗珠子构成。

每颗珠子为正三棱柱,每个侧面上都有一个正整数xx,满足x<mx,并且三个面上的数字的最大公约数为11。珠子被认为是相同的,当且仅当数字序列可以通过旋转或翻转相互得到。

相邻两颗珠子不可以相同。

两串项链假如可以通过旋转相互得到,那么是被认为是相同的。

n≤1014,m≤107,T≤10n\leq 10^14, m\leq 10^7, T\leq 10

分析

这道题结合了许多的数论知识。

首先题目可以大体上分为两个部分:不同的珠子数、不同的项链数。

Part 1

如何求不同的珠子数呢?

实际上珠子相当于一个三元组(x,y,z)(x, y, z),记不同珠子类型数为retret

这里珠子的所有置换构成置换群GG,那么根据burnsideburnside引理

ret=∑x∈Gf(d)|G|ret=\frac{\sum_{x\in G}f(d)}{|G|}

而通过暴力枚举GG的元素,我们可以发现GG中有11个置换由33个轮换组成,33个置换由22个轮换组成,22个置换由11个轮换组成。

那么问题就转化为了统计最大公约数为11的有序三元组、二元组及一元组数目。

以统计三元组为例:

考虑记gng_n表示最大公约数至少为nn的三元组数目。

记fnf_n表示最大公约数为nn的三元组数目。

gn=∑n|dfd=(⌊mn⌋)3g_n = \sum_{n|d} f_d=(\lfloor\frac{m}{n}\rfloor)^3

由前面写过的文章中

然而这个形式不仅仅局限于此,考虑以下等式。

F(n)=∑n|df(d)F(n)=\sum_{n|d}f(d)

那么

f(n)=∑n|dμ(dn)F(d)f(n)=\sum_{n|d}μ(\frac{d}{n})F(d)

也是成立的。

我们不妨倒过来想,原来的莫比乌斯反演是约数的形式,那么此时变成了倍数的形式以后基本思想还是不变的,上面的式子还是挺容易理解的。

可以得到这里的

fn=∑n|dμ(dn)gdf_n=\sum_{n|d}\mu(\frac{d}{n})g_d

特别的

f1=∑ni=1μ(i)gif_1=\sum_{i=1}^n\mu(i)g_i

于是再通过上面burnsideburnside引理的式子就可以计算不同的珠子类型数了。

gig_i是可以O(1)O(1)算的,重点是在于处理μ\mu

part 2

项链的旋转同构显然也构成了一个置换群G′G',且|G′|=n|G'|=n

记不同的珠子类型数为pp。根据polyapolya定理,不同的项链数ansans

ans=∑d∈G′pf(d)|G′|ans=\frac{\sum_{d\in G'}p^{f(d)}}{|G'|}

其中G′G'中的置换f(k)f(k),其轮换数为(n,k)(n, k)

然而这里它存在对染色的限制:相邻的染色不能相同。

不妨记h(n)h(n)表示对nn组轮换染色的方案数。那么就有

h(n)=(p−1)h(n−2)+(p−2)h(n−1)h(n)=(p-1)h(n-2)+(p-2)h(n-1)

矩阵乘法即可。

然而我们直接枚举kk,每次都矩阵乘法显然是不行的。

考虑枚举gcdgcd,原式就变成了

∑ngcd=1h(gcd)φ(ngcd)\sum_{gcd=1}^n h(gcd)\varphi(\frac{n}{gcd})

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

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

空间复杂度O(m)O(m)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: