这 篇 b l o g 重 点 讨 论 P o l y a 的 应 用 , 更 详 细 的 证 明 请 百 度 . 这篇blog重点讨论Polya的应用, 更详细的证明请百度 . 这篇blog重点讨论Polya的应用,更详细的证明请百度.
B u r n s i d e 引 理 Burnside引理 Burnside引理
L = 1 ∣ G ∣ ∑ i = 1 ∣ G ∣ D ( a i ) L=\frac{1}{|G|}\sum_{i=1}^{|G|}D(a_i) L=∣G∣1i=1∑∣G∣D(ai)
L
L
L: 本质不同的方案数.
G
G
G: 置换群集合.
a
i
a_i
ai: 置换群中的第
i
i
i 个置换.
D
(
a
i
)
D(a_i)
D(ai): 进行
a
i
a_i
ai 这个置换, 状态不会变化的方案 数量.
该引理与下方内容没有太大关系, 可以暂时忽略.
P
r
o
b
l
e
m
Problem
Problem 链接
有
N
N
N 个石子围成一圈, 使用
M
M
M 种颜色染色, 求有多少种本质不同的方案.
借此问题引入 P o l y a 定 理 Polya定理 Polya定理 ↓ ↓ ↓
P o l y a 定 理 Polya定理 Polya定理
L = 1 ∣ G ∣ ∑ i = 1 ∣ G ∣ M C ( g i ) L=\frac{1}{|G|}\sum_{i=1}^{|G|}M^{C(g_i)} L=∣G∣1i=1∑∣G∣MC(gi)
先丢出公式.
这道题的 置换群
G
G
G: 转
0
0
0次, 转
1
1
1次 …转
N
−
1
N-1
N−1 次, (皆为顺时针转动).
若满足旋转
k
k
k 个位置, 状态和原来相同, 那么
i
i
i 位置颜色 等于
(
i
+
k
)
%
N
(i+k)\%N
(i+k)%N 位置颜色,
旋转
t
t
t 次, 仍和原来位置相同, 即
i
i
i 位置与
(
i
+
t
∗
k
)
%
N
(i+t*k)\%N
(i+t∗k)%N 位置颜色相同,
则
i
i
i 旋转
t
t
t 个
k
k
k 次, 一定能回到原来位置, 即可以无限旋转,
所以
i
i
i 就与 所有
(
i
+
t
∗
k
)
%
N
(i+t*k)\%N
(i+t∗k)%N 位置呈现一个封闭的
循
环
节
\color{red}{循环节}
循环节.
设转了
t
t
t 次后, 第一次回到
i
i
i 位置, 则
t
∗
k
=
l
c
m
(
k
,
N
)
=
k
∗
N
g
c
d
(
k
,
N
)
t * k=lcm(k, N)=\frac{k*N}{gcd(k,N)}
t∗k=lcm(k,N)=gcd(k,N)k∗N,
∴
t
=
N
g
c
d
(
k
,
N
)
\therefore t=\frac{N}{gcd(k,N)}
∴t=gcd(k,N)N,
t t t 为 循 环 节 \color{red}{循环节} 循环节长度, 则 循 环 节 \color{red}{循环节} 循环节数量为 N t = g c d ( k , N ) \frac{N}{t}=gcd(k,N) tN=gcd(k,N).
公式中 颜色的数量为 M M M; 在 g i g_i gi 置换下, 有 C ( g i ) C(g_i) C(gi) 个 循 环 节 \color{red}{循环节} 循环节.
此题中 C ( g i ) = g c d ( k , N ) C(g_i)=gcd(k,N) C(gi)=gcd(k,N), ∴ A n s = L = 1 N ∑ k = 0 N − 1 M g c d ( k , N ) \therefore Ans=L=\frac{1}{N}\sum_{k=0}^{N-1}M^{gcd(k,N)} ∴Ans=L=N1k=0∑N−1Mgcd(k,N)
拓 展 1 拓展 1 拓展1
假如上题增加
对
称
同
构
\color{red}{对称同构}
对称同构, 则意味着 原先的两个不同方案 对称 时计为一个方案,
按
N
N
N 的奇偶 分类讨论:
-
N N N 为奇数, 对称轴上有一个点, 循环节个数为 N + 1 2 \frac{N+1}{2} 2N+1, 总共有 N N N 个对称轴置换, 则对答案贡献为 N ∗ M N + 1 2 2 N \frac{N*M^{\frac{N+1}{2}}}{2N} 2NN∗M2N+1
最后的答案为 A n s = L = 1 2 N ( ∑ k = 0 N − 1 M g c d ( k , N ) + N ∗ M N + 1 2 ) Ans=L=\frac{1}{2N}(\sum_{k=0}^{N-1}M^{gcd(k,N)}+N*M^{\frac{N+1}{2}}) Ans=L=2N1(k=0∑N−1Mgcd(k,N)+N∗M2N+1) -
N N N 为偶数, 对称轴上可以没有点, 也可以有两个点, 两种对称轴都有 N 2 \frac{N}{2} 2N 种, 总共有 N N N 个对称轴置换,
对称轴上无点时, 循环节个数为 N 2 \frac{N}{2} 2N, 对答案贡献为 M N 2 2 N \frac{M^{\frac{N}{2}}}{2N} 2NM2N,总贡献为 N 2 ∗ M N 2 2 N \frac{\frac{N}{2}*M^{\frac{N}{2}}}{2N} 2N2N∗M2N.
对称轴上有点时, 循环节个数为 N 2 + 1 \frac{N}{2}+1 2N+1, 对答案贡献为 M N 2 + 1 2 N \frac{M^{\frac{N}{2}+1}}{2N} 2NM2N+1, 总贡献为 N 2 ∗ M N 2 + 1 2 N \frac{\frac{N}{2}*M^{\frac{N}{2}+1}}{2N} 2N2N∗M2N+1.所以最后的答案为
A n s = L = 1 2 N ( ∑ k = 0 N − 1 M g c d ( k , N ) + N 2 ∗ M N 2 + N 2 ∗ M N 2 + 1 ) Ans=L=\frac{1}{2N}(\sum_{k=0}^{N-1}M^{gcd(k,N)}+\frac{N}{2}*M^{\frac{N}{2}}+\frac{N}{2}*M^{\frac{N}{2}+1}) Ans=L=2N1(k=0∑N−1Mgcd(k,N)+2N∗M2N+2N∗M2N+1)
拓 展 2 拓展2 拓展2
若
N
<
=
1
0
9
\color{red}{N<=10^9}
N<=109 ,
O
(
N
)
O(N)
O(N)计算下式会
T
L
E
TLE
TLE, 需要更快的办法,
A
n
s
=
L
=
1
N
∑
k
=
0
N
−
1
M
g
c
d
(
k
,
N
)
Ans=L=\frac{1}{N}\sum_{k=0}^{N-1}M^{gcd(k,N)}
Ans=L=N1k=0∑N−1Mgcd(k,N)
由于
g
c
d
(
k
,
N
)
∣
N
gcd(k,N)|N
gcd(k,N)∣N, 而
N
N
N的约数不会超过
2
N
2\sqrt{N}
2N 个,
考虑枚举
d
d
d,
(
d
∣
N
)
(d|N)
(d∣N)
则就只需统计
g
c
d
(
k
,
N
)
=
d
gcd(k,N)=d
gcd(k,N)=d 的
k
k
k 的个数.
d
=
g
c
d
(
k
,
N
)
=
g
c
d
(
d
∗
t
,
d
∗
N
d
)
d=gcd(k,N)=gcd(d*t, d*\frac{N}{d})
d=gcd(k,N)=gcd(d∗t,d∗dN)
则
t
t
t 与
N
d
\frac{N}{d}
dN 互质, 即
g
c
d
(
t
,
N
d
)
=
1
\color{red}{gcd(t, \frac{N}{d}) = 1}
gcd(t,dN)=1.
∴
φ
(
N
d
)
\therefore \color{red}{\varphi(\frac{N}{d})}
∴φ(dN) 即为
g
c
d
(
k
,
N
)
=
d
gcd(k,N)=d
gcd(k,N)=d 的
k
k
k 的个数.
于是
A
n
s
=
L
=
1
N
∑
d
∣
N
φ
(
N
d
)
∗
M
d
Ans=L=\frac{1}{N}\sum_{d|N}\varphi(\frac{N}{d}) *M^d
Ans=L=N1d∣N∑φ(dN)∗Md
.
如
何
求
解
φ
(
x
)
?
如何求解 \varphi(x)?
如何求解φ(x)?
根据定义:
φ
(
x
)
=
x
∏
p
i
∣
x
(
1
−
1
p
i
)
\varphi(x)=x\prod_{p_i|x}(1-\frac{1}{p_i})
φ(x)=xpi∣x∏(1−pi1)
通分得:
φ
(
x
)
=
x
∏
p
i
∣
x
p
i
−
1
p
i
\varphi(x) = x\prod_{p_i|x}\frac{p_i-1}{p_i}
φ(x)=x∏pi∣xpipi−1
按上式实现, 时间复杂度小于
O
(
N
)
O(\sqrt{N})
O(N), 均摊
O
(
l
o
g
N
)
?
O(logN)?
O(logN)?
这里给出求解函数,
int Get_phi(int x){
int s = x;
for(int i = 2; i*i <= x; i ++)
if(x % i == 0){ //找到一个质因数
s = s/i*(i-1);
while(x%i == 0) x /= i;
}
if(x > 1) s = s/x*(x-1); //不可能出现两个大于 sqrt(N) 的质因数, 所以只可能剩下一个, 处理掉就好 .
return s;
}
所以 O ( N ) , O ( l o g N ) O(\sqrt{N}),O(logN) O(N),O(logN) 分别求出所有约数 d d d 和 φ ( N d ) \varphi(\frac{N}{d}) φ(dN) 即可, 时间复杂度 O ( N l o g N ) O(\sqrt{N}logN) O(NlogN).
C o d e \mathcal{Code} Code
#include<bits/stdc++.h>
#define reg register
const int mod = 1e9 + 7;
int T;
int N;
int phi(int x){
int s = x;
for(reg int i = 2; i*i <= x; i ++)
if(x % i == 0){
s = s/i * (i-1);
while(x % i == 0) x /= i;
}
if(x > 1) s = s/x * (x-1);
return s;
}
int KSM(int a, int b){
int s = 1; a %= mod;
while(b){
if(b & 1) s = 1ll*s*a % mod;
a = 1ll*a*a % mod, b >>= 1;
}
return s;
}
void Work(){
scanf("%d", &N);
int Ans = 0;
int lim = sqrt(N);
for(reg int d = 1; d <= lim; d ++){
if(N % d) continue ;
Ans = ( 1ll*Ans + (1ll*phi(N/d) * KSM(N, d) % mod) ) % mod;
int d_2 = N / d;
if(d_2 == d) continue ;
Ans = ( 1ll*Ans + (1ll*phi(N/d_2) * KSM(N, d_2) % mod) ) % mod;
}
printf("%d\n", (1ll*Ans*KSM(N, mod-2)) % mod);
}
int main(){
scanf("%d", &T);
while(T --) Work();
return 0;
}
例 题 例题 例题
更多例题请戳 这里 .