Polya 定理入门[Burnside引理,Polya定理,欧拉函数]

这 篇 b l o g 重 点 讨 论 P o l y a 的 应 用 , 更 详 细 的 证 明 请 百 度 . 这篇blog重点讨论Polya的应用, 更详细的证明请百度 . blogPolya,.


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=G1i=1GD(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=G1i=1GMC(gi)

先丢出公式.

这道题的 置换群 G G G: 转 0 0 0次, 转 1 1 1次 …转 N − 1 N-1 N1 次, (皆为顺时针转动).
若满足旋转 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+tk)%N 位置颜色相同,
i i i 旋转 t t t k k k 次, 一定能回到原来位置, 即可以无限旋转,
所以 i i i 就与 所有 ( i + t ∗ k ) % N (i+t*k)\%N (i+tk)%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)} tk=lcm(k,N)=gcd(k,N)kN,
∴ 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=0N1Mgcd(k,N)


拓 展 1 拓展 1 1

假如上题增加 对 称 同 构 \color{red}{对称同构} , 则意味着 原先的两个不同方案 对称 时计为一个方案,
N N N 的奇偶 分类讨论:

  1. 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} 2NNM2N+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=0N1Mgcd(k,N)+NM2N+1)

  2. 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} 2N2NM2N.
    对称轴上有点时, 循环节个数为 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} 2N2NM2N+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=0N1Mgcd(k,N)+2NM2N+2NM2N+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=0N1Mgcd(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) (dN)
则就只需统计 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(dt,ddN)
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=N1dNφ(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)=xpix(1pi1)
通分得: φ ( x ) = x ∏ p i ∣ x p i − 1 p i \varphi(x) = x\prod_{p_i|x}\frac{p_i-1}{p_i} φ(x)=xpixpipi1
按上式实现, 时间复杂度小于 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(N logN).


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;
}

例 题 例题

更多例题请戳 这里 .


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值