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. 自定义MVC路由配置

    首先我用MVC4新增一个订单查看的功能 1.创建控制器OrderController namespace MvcApplication3.Controllers { public class Orde ...

  2. Adapting to views using css or js

    using css @media screen and (-ms-view-state: fullscreen-landscape) { } @media screen and (-ms-view-s ...

  3. mvc3.0中[ValidateInput(false)]失效的问题

    在asp.net mvc3.0中[ValidateInput(false)]特性失效了,只需要在网站根目录中的web.config中做如下配置即可: <system.web> <ht ...

  4. c++ 内存泄露的检查

    对于c++的内存泄露检测,除了我们自己手动检查以外,还可以使用c++中的函数来帮助我们检测, 如下代码: #include "stdafx.h" #include <stri ...

  5. oracle srvctl 命令

    SRVCTL命令可以控制RAC数据库中的instance,listener以及services. 通常SRVCTL在ORACLE用户下执行.下面我们来介绍srvctl命令. 1.通过SRVCTL命令来 ...

  6. 浅谈 iOS 之 Crash log 符号化

    其实,对于做移动 APP 开发的同学来说,质量和体验都是同等重要的.一个 APP 应用如果经常「闪退」,是产品质量很差的一个体现,那么用户体验就更不用再提了. *** 上面是笔者截取的国外一家公司对用 ...

  7. UVA 658 It's not a Bug, it's a Feature!

    这个题目巧妙之处在于用二进制的每个位1,0分别表示bug的有无,以及实施补丁对相应bug的要求以及实施后的对bug的影响. 软件bug的状态:1表示相应bug仍然存在,0表示已经修复.这样可以将软件的 ...

  8. cocos-html5 Json 灵活 遍历方式 不同方式的缺陷,优点总结

    1,四种解析Json的方式:Part 1 var list1 = [1,3,4]; alert(list1[1]); var list2 = [{"name":"leam ...

  9. new[]上面居然有一个内存计数,怪不得delete[]从来不出错

    开眼界了,留个爪,以后再仔细看几遍: http://www.cnblogs.com/hazir/p/new_and_delete.html

  10. 点点滴滴-NET下的常用框架

    刘冬的博客:http://www.cnblogs.com/GoodHelper/category/214139.html (Spring.net和Nhibernate) Kyo-yo  : http: ...