(JZOJ 3298)
有一个 n 颗珠子组成的项链
每颗珠子有3个面,可以写3个数字,数字的范围 (0,a] ,两颗珠子是相同的当且仅当他们可以通过旋转变成一样
每颗珠子上的三个数的最大公约数必须等于1
相邻两颗珠子必须不同
如果两串项链可以通过旋转变成一样的,我们认为这两串项链相同。
给定 n 和 a ,求有多少不同的项链?答案对 1000000007 取模。
对于 10 的 数据: n<=10,a<=10,T<=10 ;
对于 20 的 数据: n<=1000,a<=100,T<=10 ;
对于 40 的 数据: n<=109,a<=100,T<=10 ;
对于 60 的 数据: n<=106,a<=105,T<=10 ;
对于 80 的数据: n<=109,a<=105,T<=10 ;
对于 100 的 数据: n<=1014,a<=107,T<=10 ;
先求珠子种类
有用的只有有序对
123 122 112 111
数字表示大小关系
111只有一种
122 112 算出12然后*2
123 算一下
12:
设 F[i][A] 表示公约数为 i ,数的取值范围为A的12有序对个数
所求即为 F[1][a]
F[1][a]=C(a,2)−∑ai=1F[i][a]
F[i][a]=∑aq=1∑ap=1gcd(p,q)=i
F[i][a]=∑a/iq=1∑a/ip=1gcd(p,q)=1
–> F[1][a/i] (也可以根据定义直接得出)
递归求解 记忆化搜索
123
设 F[i][A] 表示公约数为 i ,数的取值范围为 a 的123有序对个数
所求即为 F[1][a]
F[1][a]=C(a,3)−∑ai=1F[i][a]
F[i][a]=F[1][a/i] //根据定义可得
递归求解 记忆化搜索
综上,我们算出了珠子的种类,假设为 M
接下来是 M 种颜色给一个长度为 N 的环染色,相邻不能同色,问方案数
若旋转该环相同则属于同一种方案
设方案数为 ans
其实旋转就是置换,这些置换构成了一个群,叫做置换群
根据Burnside引理
ans=∑F(Ci)/|G|
其中 Ci 为某种置换类型【即置换群中的某一个元素】, G 为置换群, |G| 为置换群的大小。
F(Ci) 为该置换下不动点的数量
不动点就是对原问题做一次置换操作后仍不变的点
例如这题就是旋转后还是原来的环 即称为这种旋转的不动点
感性点理解就是相同的方案
我们设 Ci 表示旋转 i 颗珠子
F(Ci)=P(gcd(n,i),M)
P(n,m) 表示 M 种颜色给一个长度为 N 的环染色且相邻颜色不同的方案数(不考虑旋转)
为什么呢?
假设旋转 k 步
若一颗珠子的位置为 i ,旋转后就是 i+k
即 (i+p∗k) 的颜色都必须先相同
考虑哪些位置属于 (i+p∗k)
(i+p∗k)
−−>p∗k−p2∗n=j−i
根据扩展欧几里得算法
方程有整数解的条件当且仅当 (j−i)|gcd(k,n)
所以当 j 与 i 不同时, j−i 必然不是 gcd(k,n) 的因子
那么所有的i最多只有 gcd(k,n) 个
也就是说 gcd(k,n) 个连续的珠子就决定了这个环
方案数即为 P(gcd(k,n),M)
接下来我们考虑
∑F(Ci)=∑P(gcd(n,i),M)
∑F(Ci)=∑d|nCnt(d)∗P(d,M)
其中
Cnd(d)=∑ni=1gcd(n,i)=d
Cnd(d)=∑n/di=1gcd(n/d,i)=1
Cnd(d)=Phi(n/d)
即 ∑F(Ci)=∑d|nPhi(n/d)∗P(d,M)
P(n,m) 怎么求?
P(n,m)=P(n−1,m)∗(m−2)+P(n−2,m)∗(m−1)
插入 1 颗珠子,只有 m−2 种可能
插入 2 颗珠子,先放一颗与原开头相同的,再放另一颗的时候就有 m−1 种可能
且两种插入方式必然没重复(一个首尾不同,一个首尾相同)
特征根求解通项公式
P(n,m)=(m−1)n+(−1)n∗(m−1);
完美得解