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. 【@Transactional】Spring 之注解事务 @Transactional

    spring 事务注解 默认遇到throw new RuntimeException("...");会回滚 需要捕获的throw new Exception("...&q ...

  2. 软件测试 -- 和用户共同测试(UAT测试)的注意点有哪些

    软件产品在投产前,通常都会进行用户验收测试.如果用户验收测试没有通过,直接结果就是那不到“Money”,间接影响是损害了公司的形象,而后者的影响往往更严重.根据作者的经验,用户验收测试一定要让用户满意 ...

  3. IIS MIME类型问题(html5 video 本地打开可以,IIS打开不了)

    问题: mediaelement js(html 5 视频插件)网页用ie9本地打开可以,iis,vs2010在ie9上运行不了,chrome可以 (在博客园里有个人跟我遇到相同的问题:http:// ...

  4. gdb在Mac上的安装步骤

    到gdb官网下载gdb安装包,解压后,在“终端”中进入其目录:然后依次执行如下命令行: 1st:CFLAGS='-Wno-string-plus-int -g -O2' ./configure --d ...

  5. 记一个菜鸟在Linux上部署Tomcat的随笔

    以前都只是在园子里找各种资料.文档.各种抱大腿,今天是第一次进园子里来添砖加瓦,实话说,都不知道整些啥东西上来,就把自己在Linux上搭建Tomcat的过程记录下来,人笨,请各位大虾们勿喷. 虽然做开 ...

  6. SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-004-使用AspectJ’s pointcut expression language定义Pointcut

    一. 1.在Spring中,pointcut是通过AspectJ’s pointcut expression language来定义的,但spring只支持它的一部分,如果超出范围就会报Illegal ...

  7. Oracle Form Developer: Folder FRM-99999 Error 14212

    Question: 做FOLDER文件夹功能,打开FORM错误提示: FRM-99999:出现1412错误.有关该错误的详细信息,请参阅发行说明文件(relnotes) Answer: 原因是FOLD ...

  8. 归纳决策树ID3(Java实现)

    先上问题吧,我们统计了14天的气象数据(指标包括outlook,temperature,humidity,windy),并已知这些天气是否打球(play).如果给出新一天的气象指标数据:sunny,c ...

  9. bzoj1801

    题目就是每行每列最多放两个炮的意思: 首先不难想到状态压缩dp,但是当n,m<=100的时候显然会跪掉: 考虑每行最多就2个点,状压dp浪费了大量的空间 由于每行最多两个点,我们可以直接用f[i ...

  10. PHP 'ext/gd/gd.c' gdImageCrop整数符号错误漏洞

    漏洞版本: PHP 5.5.x 漏洞描述: CVE ID:CVE-2013-7328 PHP是一种HTML内嵌式的语言. PHP 'ext/gd/gd.c' gdImageCrop函数存在多个整数符号 ...