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

$这篇blog重点讨论Polya的应用, 更详细的证明请百度 .$
___

$Burnside引理$

$$L=\frac{1}{|G|}\sum_{i=1}^{|G|}D(a_i)$$

$L$: 本质不同的方案数.
$G$: 置换群集合.
$a_i$: 置换群中的第 $i$ 个置换.
$D(a_i)$: 进行 $a_i$ 这个置换, 状态不会变化的方案 数量.

该引理与下方内容没有太大关系, 可以暂时忽略.
___
$Problem$ 链接
有 $N$ 个石子围成一圈, 使用 $M$ 种颜色染色, 求有多少种本质不同的方案.

借此问题引入 $Polya定理$ $↓$


$Polya定理$

$$L=\frac{1}{|G|}\sum_{i=1}^{|G|}M^{C(g_i)}$$

先丢出公式.

这道题的 置换群 $G$: 转$0$次, 转$1$次 ...转 $N-1$ 次, (皆为顺时针转动).
若满足旋转 $k$ 个位置, 状态和原来相同, 那么 $i$ 位置颜色 等于 $(i+k)%N$ 位置颜色,
旋转 $t$ 次, 仍和原来位置相同, 即 $i$ 位置与 $(i+tk)%N$ 位置颜色相同,
则 $i$ 旋转 $t$ 个 $k$ 次, 一定能回到原来位置, 即可以无限旋转,
所以 $i$ 就与 所有 $(i+t
k)%N$ 位置呈现一个封闭的 $\color{red}{循环节}$.
设转了 $t$ 次后, 第一次回到 $i$ 位置, 则
$t * k=lcm(k, N)=\frac{k*N}{gcd(k,N)}$,
$\therefore t=\frac{N}{gcd(k,N)}$,

$t$ 为$\color{red}{循环节}$长度, 则$\color{red}{循环节}$数量为 $\frac{N}{t}=gcd(k,N)$.

公式中 颜色的数量为 $M$; 在 $g_i$ 置换下, 有 $C(g_i)$ 个 $\color{red}{循环节}$.

此题中 $C(g_i)=gcd(k,N)$, $$\therefore Ans=L=\frac{1}{N}\sum_{k=0}^{N-1}M^{gcd(k,N)}$$
___

$拓展 1$

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

  1. $N$ 为奇数, 对称轴上有一个点, 循环节个数为 $\frac{N+1}{2}$, 总共有 $N$ 个对称轴置换, 则对答案贡献为 $\frac{NM^{\frac{N+1}{2}}}{2N}$
    最后的答案为 $$Ans=L=\frac{1}{2N}(\sum_{k=0}^{N-1}M^{gcd(k,N)}+N
    M^{\frac{N+1}{2}})$$
  2. $N$ 为偶数, 对称轴上可以没有点, 也可以有两个点, 两种对称轴都有 $\frac{N}{2}$ 种, 总共有 $N$ 个对称轴置换,
    对称轴上无点时, 循环节个数为$\frac{N}{2}$, 对答案贡献为 $\frac{M^{\frac{N}{2}}}{2N}$,总贡献为$\frac{\frac{N}{2}M^{\frac{N}{2}}}{2N}$.
    对称轴上有点时, 循环节个数为$\frac{N}{2}+1$, 对答案贡献为 $\frac{M^{\frac{N}{2}+1}}{2N}$, 总贡献为 $\frac{\frac{N}{2}
    M^{\frac{N}{2}+1}}{2N}$.

    所以最后的答案为
    $$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})$$
    ___

$拓展2$

若 $\color{red}{N<=10^9}$ , $O(N)$计算下式会 $TLE$, 需要更快的办法,
$$Ans=L=\frac{1}{N}\sum_{k=0}^{N-1}M^{gcd(k,N)}$$

由于 $gcd(k,N)|N$, 而$N$的约数不会超过 $2\sqrt{N}$ 个,
考虑枚举 $d$, $(d|N)$
则就只需统计 $gcd(k,N)=d$ 的 $k$ 的个数.
$d=gcd(k,N)=gcd(dt, d\frac{N}{d})$
则 $t$ 与 $\frac{N}{d}$ 互质, 即 $\color{red}{gcd(t, \frac{N}{d}) = 1}$.
$\therefore \color{red}{\varphi(\frac{N}{d})}$ 即为 $gcd(k,N)=d$ 的 $k$ 的个数.

于是 $$Ans=L=\frac{1}{N}\sum_{d|N}\varphi(\frac{N}{d}) *M^d$$
.

$如何求解 \varphi(x)?$
根据定义: $$\varphi(x)=x\prod_{p_i|x}(1-\frac{1}{p_i})$$
通分得: $\varphi(x) = x\prod_{p_i|x}\frac{p_i-1}{p_i}$
按上式实现, 时间复杂度小于 $O(\sqrt{N})$, 均摊 $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(\sqrt{N}),O(logN)$ 分别求出所有约数 $d$ 和 $\varphi(\frac{N}{d})$ 即可, 时间复杂度 $O(\sqrt{N}logN)$.
___
$\mathcal{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;
}

$例题$

更多例题请戳 这里 .



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

原文地址:https://www.cnblogs.com/zbr162/p/11404147.html

时间: 2024-10-11 04:53:20

Polya 定理入门[Burnside引理,Polya定理,欧拉函数]的相关文章

费马小定理,欧拉函数

在证明这些定理之前先证明一个有意思的定理. 对于0 mod m,n mod m , 2n mod m, 3n mod m, 4n mod m... (m-1)n mod m 对应解集序列 一定有 m/d份 0 d 2d 3d..m-d. (不一定按照顺序) 这样的解. 其中d = gcd(n,m) 具体点:n=8,m=12.  d = gcd(n,m)=4 对于 0 mod 12,8 mod 12,16 mod 12,24 mod 12,32 mod 12,40 mod 12...88 mod

Polya定理,Burnside引理(转)

设G是一个集合,*是G上的二元运算,如果(G,*)满足下面的条件: 封闭性:对于任何a,b∈G,有a*b∈G; 结合律:对任何a,b,c∈G有(a*b)*c=a*(b*c); 单位元:存在e∈G,使得对所有的a∈G,都有a*e=e*a=a; 逆元:对于每个元素a∈G,存在x∈G,使得a*x=x*a=e,这个时候记x为a-1,称为a的逆元,那么则称(G,*)为一个群. 例:G={0,1,2,3,4....n-1}那么它在mod n加法下是一个群. 群元素的个数有限,称为有限群,且其中元素的个数称为

poj2054Color polya定理+欧拉函数优化

没想到贱贱的数据居然是错的..搞得我调了一中午+晚上一小时(哦不d飞LJH掉RP毕竟他是BUFF)结果重判就对了五次.. 回归正题,这题傻子都看得出是polya定理(如果你不是傻子就看这里),还没有翻转,就一个旋转,结果我就欢快的打完交上去了.傻子都知道会TLE,n<=1e9啊,O(n)都原地爆炸,那怎么办...一脸懵逼(然后就膜题解了) 可以发现,这题公式就是sigma(gcd(k,n))(k=1~n),然后该怎么优化呢,我(??)发现gcd(k,n)里面肯定有一些k和n的gcd是相同的,那我

【poj2154】Color Polya定理+欧拉函数

题目描述 $T$ 组询问,用 $n$ 种颜色去染 $n$ 个点的环,旋转后相同视为同构.求不同构的环的个数模 $p$ 的结果. $T\le 3500,n\le 10^9,p\le 30000$ . 题解 Polya定理+欧拉函数 根据 poj2409 中得到的结论,答案为: $\frac{\sum\limits_{i=1}^nn^{\gcd(i,n)}}n=\sum\limits_{i=1}^nn^{\gcd(i,n)-1}$ 由于 $n$ 有 $10^9$ 之大,因此考虑优化这个式子. 枚举

poj2409 &amp; 2154 polya计数+欧拉函数优化

这两个题都是项链珠子的染色问题 也是polya定理的最基本和最经典的应用之一 题目大意: 用m种颜色染n个珠子构成的项链,问最终形成的等价类有多少种 项链是一个环.通过旋转或者镜像对称都可以得到置换 旋转可以旋转 i=[1,n]次..画图可以看出循环节有gcd(n,i)个 镜像对称的置换画个图也是很容易找的 然后通过polya定理就可以容易的求出等价类的种数了 2409就是这样一个裸题,以下为ac代码 #include <iostream> #include <stdio.h> #

[ACM] POJ 2154 Color (Polya计数优化,欧拉函数)

Color Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7630   Accepted: 2507 Description Beads of N colors are connected together into a circular necklace of N beads (N<=1000000000). Your job is to calculate how many different kinds of th

poj 2154 Color(polya计数 + 欧拉函数优化)

http://poj.org/problem?id=2154 大致题意:由n个珠子,n种颜色,组成一个项链.要求不同的项链数目,旋转后一样的属于同一种,结果模p. n个珠子应该有n种旋转置换,每种置换的循环个数为gcd(i,n).如果直接枚举i,显然不行.但是我们可以缩小枚举的数目.改为枚举每个循环节的长度L,那么相应的循环节数是n/L.所以我们只需求出每个L有多少个i满足gcd(i,n)= n/L,就得到了循环节数为n/L的个数.重点就是求出这样的i的个数. 令cnt = gcd(i,n) =

费马小定理及欧拉函数

2016.1.26 对于m=p1e1 . p2e2 . p3e3 . …… . pnen 欧拉函数定义为φ(m)=m * ∏(pi – 1)/pi 其意义为不超过m并且和m互素的数的个数 特别的φ(1)=1 对于和m互素的x,有xφ(m)≡1(mod m) 特别的,当p为素数时,x无法被p整除,φ(p)=p-1,于是便有费马小定理Xp-1≡1(mod p) 在p是素数时,对任意正整数x都有Xp≡X(mod p) 于是对于a的逆元x,有ax≡1(mod m),对于a,m互素时,有x=am-2,于是

欧拉函数、欧拉定理和费马小定理

对于正整数n,欧拉函数是小于等于n的正整数中与n互质的数的数目,表示为φ(n). 性质1:对于素数p,φ(p)=p-1. 性质2:对于两个互质数p,q,φ(pq)=φ(p)*φ(q)=(p-1)(q-1).(积性函数)(待证) 性质3:若n是质数p的k次幂,φ(n)=pk-pk-1=(p-1)pk-1,因为除了p的倍数外,其他数都跟n互质. 性质4: 因为:x可以分解成p1q1×p2q2×p3q3--×pnqn (pi为x的质因数) 因为piqi两两互质,所以:φ(x)=φ(p1q1)×φ(p2