208. Toral Tickets

time limit per test: 0.25 sec.
memory limit per test: 65536 KB
input: standard
output: standard

On the planet Eisiem passenger tickets for the new mean of transportation are planned to have the form of tores.

Each tore is made of a single rectangular black rubber sheet containing N × M squares. Several squares are marked with white, thus encoding the ticket's source and destination.

When the passenger buys the ticket, the ticket booking machine takes the rubber sheet, marks some squares to identify the route of the passenger, and then provides it to the passenger. The passenger next must glue the ticket.

The ticket must be clued the following way. First two its sides of greater length are glued together, forming a cylinder. Next cylinder base circles, each of which has the length equal to the length of the short side of the original rubber sheet, are glued together. They must be glued in such a way, that the cells, sides of which are glued, first belonged to the same row of the sheet. Note that the inner and the outer part of the sheet can be distinguished.

The resulting tore is the valid ticket.

Note that if the original sheet is square, there are two topologically different ways to make a tore out of a rubber sheet.

Ticket material is so perfect and gluing quality is so fine, that no one is able to find the seam, and this leads to some problems. First, the same tore can be obtained using different sheets. More of that, the same sheet can lead to tores that look a bit different.

Now the transport companies of Eisiem wonder, how many different routes they can organize, so that the following conditions are satisfied:

tickets for different routes are represented by different tores;

if some rubber sheet was marked to make the tore for some route, it cannot be used to make the tore for another route.

Help them to calculate the number of routes they can organize.

Input

The first line of the input file contains N and M (1 ≤ N, M ≤ 20).

Output

Output the number of routes Eisiem transport companies can organize.

Sample test(s)

Input

Test #1

2 2

Test #2

2 3

Output

Test #1

6

Test #2

13

题意

给你N和M,对于一个N*M的单面方格纸你可以对它的每个个格子黑白染色,然后把方格纸的长边卷起来,卷成一个圆柱体,然后再把两个短边形成的圆也接起来,形成一个游泳圈的形状(我们染的色只在游泳圈的外表面)。如果对于两种黑白染色方案,通过卷成这样的游泳圈后,是一样的,则这两种方案也是一样的。给定N,M<=20 ,求染色方案总数.


很明显的polya计数,不会的话下面列出了一些参考:

  1. 刘老师的黑书
  2. http://wenku.baidu.com/view/bf92a95f804d2b160b4ec0be.html
  3. http://zhangchi.weebly.com/uploads/8/7/5/5/8755757/polya.pdf

需要高精度。

#include <bits/stdc++.h>
#define rep(_i, _j) for(int _i = 1; _i <= _j; ++_i)
const int inf = 0x3f3f3f3f;
typedef long long LL;
typedef double DB;
using namespace std; const int maxm = 20 + 2;
const int maxn = 400 + 20;
const int maxlen = 140 + 10;
struct big_num {
int d[maxlen], len;
big_num() {
memset(d, 0, sizeof d);
len = 1;
}
inline int & operator [] (int index) {
return d[index];
}
friend big_num operator + (big_num lhs, big_num rhs) {
big_num ret;
ret.len = max(lhs.len, rhs.len);
for(int i = 1; i <= ret.len; ++i) {
ret[i] += lhs[i] + rhs[i];
if(ret[i] > 9) {
ret[i] %= 10, ret[i + 1] += 1;
}
}
if(ret[ret.len + 1] > 0) ++ret.len;
return ret;
}
friend big_num operator / (big_num lhs, int rhs) {
big_num ret;
int remain = 0;
for(int i = lhs.len; 0 < i; --i) {
remain = remain * 10 + lhs[i];
if(remain >= rhs) {
ret[i] = remain / rhs;
remain %= rhs;
}
}
for(ret.len = maxlen - 1; 1 < ret.len; --ret.len) {
if(ret[ret.len] > 0) break;
}
return ret;
}
void print() {
for(int i = len; 0 < i; --i)
printf("%d", d[i]);
}
};
big_num pow2[maxn], ans; int n, m;
int cache[maxn], hash[maxn];
int Ranma[maxm][maxm]; void right_shift() {
for(register int i = 0, t; i < n; ++i) {
t = Ranma[i][m - 1];
for(int j = m - 1; 0 < j; --j) {
Ranma[i][j] = Ranma[i][j - 1];
}
Ranma[i][0] = t;
}
}
void down_shift() {
for(register int i = 0, t; i < m; ++i) {
t = Ranma[n - 1][i];
for(int j = n - 1; 0 < j; --j) {
Ranma[j][i] = Ranma[j - 1][i];
}
Ranma[0][i] = t;
}
}
void rot() {
int tmp[maxm][maxm];
memcpy(tmp, Ranma, sizeof Ranma);
for(int i = 0; i < m; ++i) {
for(int j = n - 1; -1 < j; --j) {
Ranma[i][n - 1 - j] = tmp[j][i];
}
}
swap(n, m);
} int calc() {
int ret = 0;
memset(hash, 0, sizeof hash);
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j) {
cache[i * m + j] = Ranma[i][j];
}
}
for(register int i = 0, uper = n * m, now; i < uper; ++i) {
if(!hash[i]) {
++ret;
for(now = i; !hash[now]; hash[now] = 1, now = cache[now]);
}
}
return ret;
}
void print() {
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j) {
printf("%d ", Ranma[i][j]);
}
puts("");
}
puts("");
}
int main() {
#ifndef ONLINE_JUDGE
freopen("208.in", "r", stdin); freopen("208.out", "w", stdout);
#endif pow2[0].d[1] = 1;
for(int i = 1; i < maxn; ++i)
pow2[i] = pow2[i - 1] + pow2[i - 1];
scanf("%d%d", &n, &m);
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j) {
Ranma[i][j] = i * m + j;
}
}
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j) {
ans = ans + pow2[calc()];
rot();
if(n == m) ans = ans + pow2[calc()];
rot();
ans = ans + pow2[calc()];
rot();
if(n == m) ans = ans + pow2[calc()];
rot();
right_shift();
}
down_shift();
}
ans = ans / (n * m * 2 * (n == m ? 2 : 1));
ans.print();
puts(""); return 0;
}

SGU 208. Toral Tickets的更多相关文章

  1. 【SGU 390】Tickets (数位DP)

    Tickets   Description Conductor is quite a boring profession, as all you have to do is just to sell ...

  2. sgu208:Toral Tickets(P&#243;lya定理)

    题意简述:给你N和M,对于一个N∗M的单面方格纸你能够对它的每 个个格子黑白染色.然后把方格纸的长边卷起来,卷成一个圆柱体,然后再把 两个短边形成的圆也接起来.形成一个游泳圈的形状(我们染的色仅仅在游 ...

  3. POJ2828 Buy Tickets[树状数组第k小值 倒序]

    Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 19012   Accepted: 9442 Desc ...

  4. ACM: FZU 2112 Tickets - 欧拉回路 - 并查集

     FZU 2112 Tickets Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u P ...

  5. Tickets——H

    H. Tickets Jesus, what a great movie! Thousands of people are rushing to the cinema. However, this i ...

  6. POJ 2828 Buy Tickets(线段树 树状数组/单点更新)

    题目链接: 传送门 Buy Tickets Time Limit: 4000MS     Memory Limit: 65536K Description Railway tickets were d ...

  7. SGU 495. Kids and Prizes

    水概率....SGU里难得的水题.... 495. Kids and Prizes Time limit per test: 0.5 second(s)Memory limit: 262144 kil ...

  8. ACM: SGU 101 Domino- 欧拉回路-并查集

    sgu 101 - Domino Time Limit:250MS     Memory Limit:4096KB     64bit IO Format:%I64d & %I64u Desc ...

  9. 【SGU】495. Kids and Prizes

    http://acm.sgu.ru/problem.php?contest=0&problem=495 题意:N个箱子M个人,初始N个箱子都有一个礼物,M个人依次等概率取一个箱子,如果有礼物则 ...

随机推荐

  1. python基础----多态与多态性、super函数用法、继承原理

    一.多态与多态性                                                                        ㈠多态: 多态指的是一类事物有多种形态, ...

  2. jsp中文乱码终极解决方法

    转载http://blog.csdn.net/csh624366188/article/details/6657350 一 找出问题的根源    乱码可能出现的地方:1 jsp页面中          ...

  3. php curl使用ss代理

    1.安装 ss,过程略 2.ss 配置文件 { "server":"x.x.x.x", #你的 ss 服务器 ip "server_port" ...

  4. Vue.js随笔四(方法的声明和使用)

    1.首先你需要新建路由,这个就不多说了 2.然后在你的新的.vue里面需要如下所示的添加methods:{方法},然后按钮的里面你会看到v-on:click,这就是点击这个按钮会触发的动作,这个就是触 ...

  5. Restful 接口传递参数

    首先补充一下什么是 Restful ,这里简单说一下,如果一个架构符合REST原则,就称它为RESTful架构. RESTful架构特点: (1)每一个URI代表一种资源: (2)客户端和服务器之间, ...

  6. Windows API函数大全(精心总结)

    WindowsAPI函数大全(精心总结)    目录 1. API之网络函数... 1 2. API之消息函数... 1 3. API之文件处理函数... 2 4. API之打印函数... 5 5. ...

  7. [转]C/C++作用域详解

    原文地址:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777433.html 作用域规则告诉我们一个变量的有效范围,它在哪儿创建,在 ...

  8. CSS3之伪元素选择器和伪类选择器

    伪类选择器,和一般的DOM中的元素样式不一样,它并不改变任何DOM内容.只是插入了一些修饰类的元素,这些元素对于用户来说是可见的,但是对于DOM来说不可见.伪类的效果可以通过添加一个实际的类来达到. ...

  9. Centos7系统环境下Solr之Java实战(一)搭建solr服务器

    搭建步骤 1.分别上传tomcat.sorl到指定文件夹并解压 2.把solr部署到Tomcat下 通过命令 cp apache-tomcat-7.0.47 /usr/local/sorl/tomca ...

  10. Lua只读表

    利用Lua的元表(metatable)和元函数(metafunction)可以很简单的实现此功能. 其实现大致分为三个部分 1.禁止在表中创建新值 2.禁止改变已有的值 3.将子表也变为只读 1.禁止 ...