http://www.cnblogs.com/wenruo/p/5304698.html

先看 Polya定理,Burnside引理回忆一下基础知识。总结的很棒。

一个置换就是集合到自身的一个双射,置换群就是元素为置换的群。

再看 Polya入门  涨涨姿势。

Burnside定理,在每一种置换群也就是等价群中的数量和除以置换群的数量,即非等价的着色数等于在置换群中的置换作用下保持不变的着色平均数。

Polya定理:设G={π1,π2,π3........πn}是X={a1,a2,a3.......an}上一个置换群,用m中颜色对X中的元素进行涂色,那么不同的涂色方案数为:1/|G|*(mC(π1)+mC(π2)+mC(π3)+...+mC(πk)). 其中C(πk)为置换πk的循环节的个数。
 
代码:
ll gcd(ll a, ll b)
{
return b == 0 ? a : gcd(b, a % b);
} ll pow(ll x, ll n)
{
ll res = 1;
while (n) {
if (n & 1) res *= x;
x = x * x;
n >>= 1;
}
return res;
} ll polya(ll m, ll n)
{
ll ans = 0;
for (ll i = 0; i < n; ++i) {
ans += pow(m, gcd(n, i));
}
if (n & 1) ans += n * pow(m, n / 2 + 1);
else ans += (pow(m, n / 2) + pow(m, n / 2 + 1)) * n / 2; return ans / 2 / n;
}

优化后

ll pow(ll x, ll n)
{
ll res = 1;
while (n) {
if (n & 1) res = res * x % p;
x = x * x % p;
n >>= 1;
}
return res;
} ll eular(ll n)
{
ll res = 1;
for (ll i = 2; i * i <= n; ++i) {
if (n % i == 0) {
n /= i;
res = res * (i - 1);
while (n % i == 0) {
n /= i;
res = res * i;
}
}
}
if (n > 1) res = res * (n - 1);
return res % p;
} ll polya(int m, int n)
{
ll sum = 0;
ll i;
for (i = 1; i * i < n; ++i) {
if (n % i == 0) {
sum += eular(i) * pow(m, n / i) % p;
sum += eular(n / i) * pow(m, i) % p;
}
}
if (i * i == n) sum += eular(i) * pow(m, i) % p; return sum / n;
}

再优化一下欧拉函数

#define N 100000
int prime[N];
bool is_prime[N]; int sieve(int n)
{
int p = 0;
for (int i = 0; i <= n; ++i) is_prime[i] = true;
is_prime[0] = is_prime[1] = false;
for (int i = 2; i <= n; ++i) {
if (is_prime[i]) {
prime[p++] = i;
for (int j = 2 * i; j <= n; j += i)
is_prime[j] = false;
}
}
return p;
} int phi(int n)
{
int rea = n;
for(int i = 0; prime[i] * prime[i] <= n; i++)
{
if(n % prime[i] == 0)
{
rea = rea - rea / prime[i];
while (n % prime[i] == 0) n /= prime[i];
}
}
if(n > 1)
rea = rea - rea / n;
return rea;
} ll polya(int m, int n)
{
ll sum = 0;
ll i;
for (i = 1; i * i < n; ++i) {
if (n % i == 0) {
sum += phi(i) * pow(m, n / i);
sum += phi(n / i) * pow(m, i);
}
}
if (i * i == n) sum += phi(i) * pow(m, i);
if (n & 1) sum += n * pow(m, n / 2 + 1);
else sum += (pow(m, n / 2) + pow(m, n / 2 + 1)) * n / 2; return sum / 2 / n;
}

Polya定理的更多相关文章

  1. 【转】Polya定理

    转自:http://endlesscount.blog.163.com/blog/static/82119787201221324524202/ Polya定理 首先记Sn为有前n个正整数组成的集合, ...

  2. 【群论】polya定理

    对Polya定理的个人认识     我们先来看一道经典题目:     He's Circles(SGU 294)         有一个长度为N的环,上面写着“X”和“E”,问本质不同的环有多少个(不 ...

  3. [wikioi2926][AHOI2002]黑白瓷砖(Polya定理)

    小可可在课余的时候受美术老师的委派从事一项漆绘瓷砖的任务.首先把n(n+1)/2块正六边形瓷砖拼成三角形的形状,右图给出了n=3时拼成的“瓷砖三角形”.然后把每一块瓷砖漆成纯白色或者纯黑色,而且每块瓷 ...

  4. HDU 3923 Invoker(polya定理+逆元)

    Invoker Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 122768/62768 K (Java/Others)Total Su ...

  5. POJ 2409 Let it Bead(Polya定理)

    点我看题目 题意 :给你c种颜色的n个珠子,问你可以组成多少种形式. 思路 :polya定理的应用,与1286差不多一样,代码一改就可以交....POJ 1286题解 #include <std ...

  6. POJ 1286 Necklace of Beads(Polya定理)

    点我看题目 题意 :给你3个颜色的n个珠子,能组成多少不同形式的项链. 思路 :这个题分类就是polya定理,这个定理看起来真的是很麻烦啊T_T.......看了有个人写的不错: Polya定理: ( ...

  7. 百练_2409 Let it Bead(Polya定理)

    描述 "Let it Bead" company is located upstairs at 700 Cannery Row in Monterey, CA. As you ca ...

  8. polya定理小结

    polya的精髓就在与对循环节的寻找,其中常遇到的问题就是项链染色类问题. 当项链旋转时有n种置换,循环节的个数分别是gcd(n, i); 当项链翻转时有n种置换,其中当项链珠子数位奇数时,循环节的个 ...

  9. HDU 4633 Who's Aunt Zhang (Polya定理+快速幂)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4633 典型的Polya定理: 思路:根据Burnside引理,等价类个数等于所有的置换群中的不动点的个 ...

随机推荐

  1. 关于\t

    tail -n 10000 sample_dbl.txt | python sitemap.py | sort -k 1 -t $'\t' | python sitecombiner.py > ...

  2. Nagios 邮箱告警的方式太OUT了!

    一般来讲,在安装完 Nagios 后,我们做的第一件最正确的事,就是设置它的邮件通知,对吧.因为如果没有这一步骤的话,你怎么能够知道什么时候会出现问题呢? 伴随着成功的初始安装,你即将是你司唯一一个能 ...

  3. urllib2.urlopen超时问题

    urllib2.urlopen超时问题 没有设置timeout参数,结果在网络环境不好的情况下,时常出现read()方法没有任何反应的问题,程序卡死在read()方法里,搞了大半天,才找到问题,给ur ...

  4. No Pain No Game

    hdu4630:http://acm.hdu.edu.cn/showproblem.php?pid=4630 题意:给定一个排序,求区间最大GCD. 题解:离散树状数组.首先把查询按左端点从大到小排序 ...

  5. minicom installation and configuration on ubuntu

    minicom是一个串口通信工具,就像Windows下的超级终端,可用来与串口设备通信.minicom完全通过键盘实现操作. install sudo apt-get install minicom ...

  6. [jobdu]二进制中1的个数

    做法是n&(n-1).据说还有变态的查表法:http://www.cnblogs.com/graphics/archive/2010/06/21/1752421.html.最后,居然必须用sc ...

  7. javaweb学习总结(三十六)——使用JDBC进行批处理

    在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率. JDBC实现批处理有两种方式:statement和pr ...

  8. 【Linux安全】查看是否存在特权用户以及是否存在空口令用户

    查看是否存在特权用户 通过判断uid是否为0来查找系统是否存在特权用户,使用命令awk即可查出. [root@pentester ~]# awk -F: '$3==0 {print $1}' /etc ...

  9. [译]GotW #6a: Const-Correctness, Part 1

    const 和 mutable在C++存在已经很多年了,对于如今的这两个关键字你了解多少? Problem JG Question 1. 什么是“共享变量”? Guru Question 2. con ...

  10. linux下跨服务器文件文件夹的复制

    文件的复制:scp –P (端口号) ./authorized_keys berchina@hadoop002:/home/berchina 文件夹的复制:scp -r -P (端口号) /home/ ...