先拓展一个之前讲过的模型的性质
对于一个编号在的环(顺时针编号),从编号为的点开始顺时针跳,每次跳步,那么最终经过的点一共有个(其中),如果我们将这个点按照编号顺序排成一个圆(不是按经过的顺序),那么相邻两个点之间的距离为
证明:显然将这个点按照编号顺序排成一个圆后,这个圆的总长度为(相邻两点之间的距离为两点编号差的绝对值)。考虑每个点的编号的形式,为,因为是从每次跳步,当跳过时就要减去,所以编号的形式就是的线性组合。故编号可以写作,也就是说相邻两个点的距离是的倍数,至少为;而总长度为,当且仅当任意相邻两个点之间的距离为才为(否则的话会更大),证毕
有了这个性质,我们就可以知道,原图一共被分成了个环,每个环的起点为
现在我们考虑Burnside引理,假设我们现在已经获得了(也就是满足题意的所有涂色方案),置换群即顺时针旋转步,我们现在要求的就是,只需要求
现在我们考虑对于一个固定的(也就是每次跳的步数已经知道了),那么根据上面的结论,我们只用考虑这个点构成的环满足题意的涂色方案一共有多少种就好了
为什么这里不能用Polya定理:Polya定理的内容就是,可以想一下这个为什么成立,主要原因还是因为各个循环置换之间互不影响,所以可以任意涂色;而这里显然是会互相影响的,所以只能用Burnside引理
计算个点构成的环满足题意的涂色方案一共有多少种:很显然的环形DP,但是这里时间复杂度卡的比较紧,如果采用容斥原理(即按照线形计算,最后强制第一个点和最后一个点涂相同颜色)的话会超时(因为你要枚举第一个点涂的颜色),此时有一个优化:不采用容斥原理,而是采用正面计算,将从一维变成二维,,这就是说第个行向量表示第一个点只能涂第种颜色,最后得到的数组经过的时间为(注意不是,因为我们要求最后一个点和第一个点涂的颜色相同,这里相当于断环成链了),然后加上的对角线就好了
计算完后,我们还不能枚举,因为太大了,此时肯定只能枚举,最后不难知道要计算,这种计算约数的欧拉函数的技巧见这篇总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构