题意简述:给你N和M,对于一个N∗M的单面方格纸你能够对它的每

个个格子黑白染色。然后把方格纸的长边卷起来,卷成一个圆柱体,然后再把

两个短边形成的圆也接起来。形成一个游泳圈的形状(我们染的色仅仅在游泳圈

的外表面)。假设对于两种黑白染色方案。通过卷成这种游泳圈后,是一样

的。则这两种方案也是一样的。给定N,M<=20。求染色方案总数.

分析:

首先我们得会Pólya定理,參见http://wenku.baidu.com/view/bf92a95f804d2b160b4ec0be.html

依据题目的要求,分两种情况:

①若N=M,那么就有翻转0o,90o,180o,270o与上下移动,左右移动共N∗M∗2∗2种置换;

②若N≠M,那么就有翻转0o,180o与上下移动,左右移动共N∗M∗2种置换;

依据Pólya定理,我们分三步:

①暴力搜出全部置换;

②搜出全部置换的循环。

③把答案累加后除以置换数。

时间复杂度:

①O(N∗M)②O(N∗M)

因此总的为O((N∗M)2)

ps.我们须要写高精度。能够预处理2的幂来进行加速。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int MAXN = 29;
const int MAXM = 29;
const int MAXL = 200; int n, m; int G;
bool check_square;
int ex[MAXN*MAXM]; struct bigNum
{
int a[MAXL];
bigNum(){memset(a, 0, sizeof(a));a[0] = 1;}
inline void operator += (const bigNum &add)
{
a[0] = max(a[0], add.a[0]);
for(int i = 1; i <= a[0]; ++i)
{
a[i] += add.a[i];
a[i+1] += a[i]/10;
a[i] %= 10;
}
if(a[a[0]+1]) a[0]++;
}
inline void operator /= (int k)
{
for(int i = a[0]; i > 0; --i)
{
a[i-1] += a[i]%k*10;
a[i] /= k;
}
for(; a[0] > 0; --a[0])
if(a[a[0]]) return ;
}
inline void print()
{
for(int i = a[0]; i > 0; --i)
printf("%d", a[i]);
}
}ans, pow2[MAXN*MAXM]; inline void init()
{
scanf("%d%d", &n, &m);
if(n == m) G = n*m*4, check_square = true;
else G = n*m*2;
for(int i = 1; i <= n*m; ++i)
ex[i] = i;
} inline int calc()
{
int re = 0;
bool hash[MAXN*MAXM] = {false};
for(int i = 1; i <= n*m; ++i)
if(!hash[i])
{
for(int j = i; !hash[j]; j = ex[j])
hash[j] = true;
re++;
}
return re;
} inline void rotate()
{
int nex[MAXN*MAXM] = {0};
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
nex[(m-j)*n+i] = ex[(i-1)*m+j];
for(int i = 1; i <= n*m; ++i) ex[i] = nex[i];
swap(n, m);
} inline void shift_down()
{
int nex[MAXN*MAXM] = {0};
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
nex[(i%n)*m+j] = ex[(i-1)*m+j];
for(int i = 1; i <= n*m; ++i) ex[i] = nex[i];
} inline void shift_right()
{
int nex[MAXN*MAXM] = {0};
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
nex[(i-1)*m+j%m+1] = ex[(i-1)*m+j];
for(int i = 1; i <= n*m; ++i) ex[i] = nex[i];
} inline void work()
{
pow2[0].a[0] = pow2[0].a[1] = 1;
for(int i = 1; i <= n*m; ++i)
{
bigNum tmp = pow2[i-1];
tmp += pow2[i-1];
pow2[i] = tmp;
}
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= m; ++j)
{
ans += pow2[calc()];
rotate();
if(check_square) ans += pow2[calc()];
rotate();
ans += pow2[calc()];
rotate();
if(check_square) ans += pow2[calc()];
rotate();
shift_right();
}
shift_down();
}
ans /= G;
} inline void print()
{
ans.print();
puts("");
} int main()
{
init();
work();
print();
return 0;
}

sgu208:Toral Tickets(P&#243;lya定理)的更多相关文章

  1. SGU 208. Toral Tickets

    208. Toral Tickets time limit per test: 0.25 sec. memory limit per test: 65536 KB input: standard ou ...

  2. Pόlya定理-学习笔记

    gi为一个为一个置换 c(g),为c(g)的轮换的数量 (循环的数量) 太监了

  3. Burnside引理与Polya定理

    感觉这两个东西好鬼畜= = ,考场上出了肯定不会qwq.不过还是学一下吧用来装逼也是极好的 群的定义 与下文知识无关.. 给出一个集合$G = \{a, b, c, \dots \}$和集合上的二元运 ...

  4. BZOJ 1004 【HNOI2008】 Cards

    题目链接:Cards 听说这道题是染色问题的入门题,于是就去学了一下\(Bunside\)引理和\(P\acute{o}lya\)定理(其实还是没有懂),回来写这道题. 由于题目中保证"任意 ...

  5. BZOJ1004: [HNOI2008]Cards(Burnside引理 背包dp)

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4255  Solved: 2582[Submit][Status][Discuss] Descript ...

  6. 恢复训练(学不动了摸会鱼) Pt. 1

    本来下午想把pre稿子写了,咕咕咕. 群论是啥也不会了,写个polya试试(手动doge)为什么博客媛没有emoji,以后万一自己搭博客一定要加上这个小东西 polya淼题:poj1286 先复吸一下 ...

  7. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  8. Mittag-Leffler定理,Weierstrass因子分解定理和插值定理

    Mittag-Leffler定理    设$D\subset\mathbb C$为区域,而$\{a_{n}\}$为$D$中互不相同且无极限点的点列,那么对于任意给定的一列自然数$\{k_{n}\}$, ...

  9. 【转】Polya定理

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

随机推荐

  1. 数据库管理系统X

    大部分DBMS提供数据定义语言DDL(Data Definition Language)和数据操作语言DML(Data Manipulation Language),供用户定义数据库的模式结构与权限约 ...

  2. Hbase数据库简介

    Hbase是基于Hadoop下分布式存储 数据库,列式存储.(https://www.imooc.com/video/17202) 动态的增加列,不像关系数据库需要提前定义好列. 关系数据库     ...

  3. Selenium3+python自动化008-操作浏览器基本方法

    一.打开网站1.第一步:从selenium里面导入webdriver模块2.打开Firefox浏览器(Ie和Chrome对应下面的)3.打开百度网址二.页面刷新1.有时候页面操作后,数据可能没及时同步 ...

  4. 自定义分隔符|/i|/x|/xs|需要转译

    小骆驼 第八章 用正则表达式进行匹配 #!/usr/bin/envperl use strict; use warnings; $_ ="#adchbehnyhme3534f\nvdh5ej ...

  5. 最近公共祖先-三(RMQ-ST)

    描述 上上回说到,小Hi和小Ho使用了Tarjan算法来优化了他们的"最近公共祖先"网站,但是很快这样一个离线算法就出现了问题:如果只有一个人提出了询问,那么小Hi和小Ho很难决定 ...

  6. 常用字符串匹配算法(brute force, kmp, sunday)

    1. 暴力解法 // 暴力求解 int Idx(string S, string T){ // 返回第一个匹配元素的位置,若没有匹配的子串,则返回-1 int S_size = S.length(); ...

  7. 在single模式修改密码

    当前是在CentOS 6.5 的命令行模式下 开机后在这个界面按随意键 接着来到新界面中,在当前选项中按下e键: 接着来到新界面,选择第二个,按下e键: 在这里我们输入single接着回车: 接着回到 ...

  8. python字符串的格式化

    # -*- coding:utf-8 -*- """ @Author:janson @Date:2018/8/1 @File:StrFormat.py "&qu ...

  9. Ubuntu 和 centos7 服务的启动

    Ubuntu 下: /etc/init.d/nginx  start | stop | reload Centos7下: service nginx start | stop | reload

  10. Centos6.5安装Nexus及安装时的一些错误

    注意:此篇博文未有配置部分,有需求的同学只能自行寻找了-- 1.下载: https://www.sonatype.com/download-oss-sonatype 2.官方推荐安装在/opt目录下 ...