题意:n 个点的环,每个点染上 m 种颜色中的一种,要求相邻点的颜色不同。若两种方案能通过任意次旋转、翻转、整体 +1 模 m 变为相同,则这两种方案相同。求方案数。n,m≤1018
先考虑一些式子:n 个点的链,相邻点不同色的方案数 A(n)=m(m−1)n−1
n 个点的环,相邻点不同色的方案数 B(n)=(m−1)n+(−1)n(m−1),通过解递推式得到。
n 个点的链,第一个不为 1 且最后一个不为 2 的方案数 C(n)=(−1)n+1(1−m)n+1−1m
假设下标从 0 开始。对下标的置换为 i→(c+i)modn 或 i→(c−i)modn。根据 Burnside,考虑枚举一个置换和整体增量 x,求出此时不变的方案数。
第二种比较简洁,发现构成若干自环和二元环,图画出来比较美观。n 为奇数时,一定存在恰好一个自环,这要求 x=0,然而一定存在由相邻的点构成的二元环,所以答案为 0。n 为偶数时,若 c 为偶数,则存在相对的两个自环,答案为 A(n2+1)。若 c 为奇数,全部为二元环,但存在两个由相邻的点构成的二元环,x=m2,答案为 [2|m]A(n2)。
考虑第一种,构成了 g=gcd(n,c)个环,环长为 d=ng。要求 dx≡0(modm) 即 mgcd(m,d)|x,0..g 相邻点不同色,其中 ag≡a0+kx(modm)。kx≡0(modm) 时,方案数即为 B(g),否则为 mC(g−1)。注意到 k 满足 kc≡g(modn) 即 kcg≡1(modd),gcd(k,d)=1。kx≡0(modm) 等价于 kq≡0(modgcd(m,d)),而 gcd(k,m,d)=1,所以当且仅当 q=x=0。此时答案为 F(g)=mC(g−1)[gcd(m,ng)−1]+B(g)。
第一类的答案为 n∑i=1F[gcd(i,n)]=∑d|nF(d)φ(nd)。Pollard-rho 求出质因子后,预处理所有因数和对应的 φ 值即可,单次 O(n14+d(n)logn)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理