polya的精髓就在与对循环节的寻找,其中常遇到的问题就是项链染色类问题。

当项链旋转时有n种置换,循环节的个数分别是gcd(n, i);

当项链翻转时有n种置换,其中当项链珠子数位奇数时,循环节的个数是n/2+1

当项链珠子数是偶数个时,当翻转线穿过珠子时,循环节个数为n/2+1,否则为n/2;

1.poj 1286:

题目大意:用三种颜色对珠子数不超过24的项链染色,问有多少种染色情况。

这道题是最基本的polya定理考察,只要带入公式即可

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const long long maxa = ;
long long edge[maxa];
void rotate(long long n, long long ii){
for(long long i = ; i < n; i++){
edge[(i+ii)%n] = i;
}
}
void turn(long long n, long long ii){
for(long long i = n-, j= ; i >= ; i--, j++){
edge[(j+ ii)%n] = i;
}
}
long long vis[maxa];
void dfs(long long i){
if(vis[i] == )return ;
vis[i] = ;
dfs(edge[i]);
}
int main(){
int n, m;
while(scanf("%d%d", &m, &n), n+m){
if(n == ){
printf("0\n");
continue;
}
long long ans = ;
for(long long i = ; i < n; i++){
rotate(n, i);
long long o = ;
memset(vis, , sizeof(vis));
for(long long k = ;k < n; k++){
if(vis[k]==){
o ++;
dfs(k);
}
}
long long sum = ;
for(long long k = ;k < o; k++){
sum *= m;
}
ans += sum;
}
for(long long i = ; i < n; i++){
turn(n, i);
long long o = ;
memset(vis, , sizeof(vis));
for(long long k = ;k < n; k++){
if(vis[k]==){
o ++;
dfs(k);
}
}
long long sum = ;
for(long long k = ;k < o; k++){
sum *= m;
}
ans += sum;
}
cout<<ans/n/<<endl;
}
}

2.poj 2409

题目大意,用c种颜色染n个珠子组成的项链,也是最基本的polya定理考察

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const long long maxa = ;
long long edge[maxa];
void rotate(long long n, long long ii){
for(long long i = ; i < n; i++){
edge[(i+ii)%n] = i;
}
}
void turn(long long n, long long ii){
for(long long i = n-, j= ; i >= ; i--, j++){
edge[(j+ ii)%n] = i;
}
}
long long vis[maxa];
void dfs(long long i){
if(vis[i] == )return ;
vis[i] = ;
dfs(edge[i]);
}
int main(){
int n, m;
while(scanf("%d%d", &m, &n), n+m){
if(n == ){
printf("0\n");
continue;
}
long long ans = ;
for(long long i = ; i < n; i++){
rotate(n, i);
long long o = ;
memset(vis, , sizeof(vis));
for(long long k = ;k < n; k++){
if(vis[k]==){
o ++;
dfs(k);
}
}
long long sum = ;
for(long long k = ;k < o; k++){
sum *= m;
}
ans += sum;
}
for(long long i = ; i < n; i++){
turn(n, i);
long long o = ;
memset(vis, , sizeof(vis));
for(long long k = ;k < n; k++){
if(vis[k]==){
o ++;
dfs(k);
}
}
long long sum = ;
for(long long k = ;k < o; k++){
sum *= m;
}
ans += sum;
}
cout<<ans/n/<<endl;
}
}

3.hdu 1812

题目大意,用c种颜色对n*n的棋盘染色,有多少种方法

其实这道题就是可以看成一些(n+1)/2串项链,有八种置换,但是最坑的是大数怎么写都超时....万进制优化也超时.....打表还不让大那么大,java是很好的解决方法...谁爱写谁写....反正我不写啦啦啦啦

4.poj 2154

题目大意,用n种颜色染长度是n的项链,结果mod p n<=10^9,p<= 30000,这里的项链只考虑旋转。

常规解法是这样sum(n^gcd(n,i))%q,但是数据太大了不允许,我们知道的是n的因子数是可以通过搜索求出来的,那么如果gcd(n,i) == m,则i的数量显然是euler(i),需要注意的是最后除n的时候,n和p不一定互质所以需要在之前做处理,也就是将公式变成了sum(n^gcd(n,i)-1)%q,需要注意的是开long long会超时,所以在要用int,有些部分需要用同余模定理优化。

#include<iostream>
#include<string.h>
#include<cmath>
#include<stdio.h>
using namespace std;
const int maxa = ;
int app[maxa][];
int o;
int ans;
int n, q;
int m;
int euler(int n){ //返回euler(n)
//if(n == 1)return 0;
int res=n,a=n;
for(int i=;i*i<=a;i++){
if(a%i==){
res=res/i*(i-);//先进行除法是为了防止中间数据的溢出
while(a%i==) a/=i;
}
}
if(a>) res=res/a*(a-);
return res;
}
int kuick(int a, int b){
int aa = ;
if(b == )return ;
aa = kuick(a, b/);
aa *= aa;
aa%= q;
if(b &) aa*= a;
aa %= q;
return aa;
}
void dfs(int ii, int nn){//cout<<"*"<<ii<<" "<<o<<" "<<nn<<endl;
if(ii == o){
int aa = euler(n/nn) % q;
ans += aa * kuick(n%q, nn-);
ans %= q;
return;
}
dfs(ii+, nn);
int ss = ;
for(int i = ; i < app[ii][]; i++){
ss *= app[ii][];
dfs(ii+, ss*nn);
}
}
int main(){
cin>>m;
while(m--){
cin>>n>>q;
int N = n;
ans = ;
int sq = sqrt(n);
o = ;
for(int i = ;i <= sq; i++){
if(n % i == ){
app[o][] = i;
app[o][] = ;
while(n %i ==){
app[o][]++;
n /= i;
}
o++;
}
}
//printf("*");
if(n != ){
app[o][] = n;
app[o++][] = ;
}
n = N;
dfs(, );
cout<<ans<<endl;
}
}

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. Polya定理

    http://www.cnblogs.com/wenruo/p/5304698.html 先看 Polya定理,Burnside引理回忆一下基础知识.总结的很棒. 一个置换就是集合到自身的一个双射,置 ...

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

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

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

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

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

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

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

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

随机推荐

  1. Windows下更改MySQL数据库的存储位置

    在MySQL安装完成后,要修改数据库存储的位置,比如从安装目录下的C:\Program Files\MySQL\MySQL Server 5.0\Data文件夹转移到D:\mySQLData文件夹. ...

  2. Centos+nginx+uwsgi+Python多站点环境搭建

    前言 新公司的第一个项目,服务器端打算用python作为restful api.所以需要在Centos上搭建nginx+fastcgi+python的开发环境,但后面网上很多言论都说uwsgi比fas ...

  3. eclipse 新建servlet

    在mac下的eclipse新建servlet报错: 解决一: --------------------------------- 解决二: 在右键项目名称中,打开 Properties->jav ...

  4. .NET MVC插件化开发(支持Script和css压缩)

    上一篇博文里面,没有支持Script和css的压缩功能以及script和css的路径问题也没有解决,所以重新发布一个版本,解决了这几个问题,并且优化了插件路由注册,现在可以很方便的实现热插拔web插件 ...

  5. JAVA构造方法,继承关系和SUPER关键字

    SUPER可调用父类的构造方法,但要注意默认调用和参数调用. 同时,在继承类时,可以用SUPER调用其它非构造方法哟. class Test extends Object{ public Test() ...

  6. 9.21 investments - chapter 4 - Summary

    转载请注明来自souldak,微博:@evagle MUTUAL FUNDS AND OTHER INVESTMENT COMPANIES KEYWORDS: investment company n ...

  7. 使用objdump objcopy查看与修改符号表

    使用objdump objcopy查看与修改符号表动态库Linuxgccfunction    我们在 Linux 下运行一个程序,有时会无法启动,报缺少某某库.这时需要查看可执行程序或者动态库中的符 ...

  8. 笔记:java并发实践2

    public interface Executor { void execute(Runnable command); } 虽然Executor是一个简单的接口,但它为灵活且强大的异步任务框架提供了基 ...

  9. Android豆瓣图书查询Demo

    原文出自:方杰| http://fangjie.info/?p=26 转载请注明出处 首先先看一下Demo预览效果吧,主要也就是两个Activity.涉及到的技术有zxing开源项目的使用,网络协议豆 ...

  10. HDU5196--DZY Loves Inversions 树状数组 逆序数

    题意查询给定[L, R]区间内 逆序对数 ==k的子区间的个数. 我们只需要求出 子区间小于等于k的个数和小于等于k-1的个数,然后相减就得出答案了. 对于i(1≤i≤n),我们计算ri表示[i,ri ...