题面

Problem Description

话说就是因为这个游戏,Lele已经变成一个名人,每当他一出现在公共场合,就有无数人找他签名,挑战。

为了防止引起社会的骚动,Lele决定还是乖乖呆在家里。

在家很无聊,Lele可不想像其他人一样每天没事在家数钱玩,于是他就开始数棋盘。他想知道,一个有N×N个格子的正方形棋盘,每个格子可以用C种不同颜色来染色,一共可以得到多少种不同的棋盘。如果一个棋盘,经过任意旋转,反射后变成另一个棋盘,这两个棋盘就是属于同一种棋盘。

比如当N=C=2的时候,有下面六种不同的棋盘

现在告诉你N和C,请你帮帮Lele算算,到底有多少种不同的棋盘

Input

本题目包含多组测试,请处理到文件结束。

每组测试数据包含两个正整数N和C(0<N,C,<31),分别表示棋盘的大小是N×N,用C种颜色来进行染色。

Output

对于每组测试,在一行里输出答案。

Sample Input

2 2 3 1

Sample Output

6 1

题解

根据polya定理,

这道题的G中一共有8个元素,分别是①不动,②顺时针转90°,③转180°,④顺时针转270°,⑤左-右翻转,⑥上-下翻转,⑦左上-右下翻转,⑧左下-右上翻转。

C(i)就是每个元素的循环节个数,对于这道题可得:

实际的答案有可能达到N^2C级别,但是我们惊讶地发现这道题不取模,所以要用高精度

这道题很毒瘤,因为他的数据组数很大很大,每次直接算要超时,数据组数比31*31大得多,但是只有31*31种状态,所以我们记忆一下。

CODE

#include<cstdio>
#include<cstring>
#include<vector>
#include<stack>
#include<queue>
#include<algorithm>
#include<map>
#include<cmath>
#include<iostream>
#define MAXN 100005
#define LL long long
#define ULL unsigned LL
#define rg register
#define lowbit(x) (-(x) & (x))
#define ENDL putchar('\n')
//#pragma GCC optimize(2)
#define DB double
//#pragma G++ optimize(3)
#define int LL
using namespace std;
inline int read() {
int f = 1,x = 0;char s = getchar();
while(s < '0' || s > '9') {if(s == '-') f = -1;s = getchar();}
while(s >= '0' && s <= '9') {x = x * 10 - '0' + s;s = getchar();}
return x * f;
}
struct it{
int len;
LL s[3005];
it(){len = 1;memset(s,0,sizeof(s));}
it(int nm) {
len = 1;memset(s,0,sizeof(s));
for(int i = 1;nm;i ++) {
s[i] = nm % 1000000000;
nm /= 1000000000;
if(s[i]) len = max(len,i);
}
}
void print() {
printf("%d",s[len]);
for(int i = len-1;i > 0;i --) {
printf("%09d",s[i]);
}
}
};
it operator + (it a,it b) {
it c; LL m = 0;
for(int i = 1;i <= a.len || i <= b.len || m;i ++) {
c.s[i] = a.s[i] + b.s[i] + m;
m = c.s[i] / 1000000000;
c.s[i] %= 1000000000;
if(c.s[i]) c.len = max(c.len,i);
}
return c;
}
it operator * (it a,it b) {
it c; LL m = 0;
for(int i = 1;i <= a.len;i ++) {
m = 0;
for(int j = 1;j <= b.len || m;j ++) {
c.s[i + j - 1] += a.s[i] * b.s[j] + m;
m = c.s[i+j-1] / 1000000000;
c.s[i+j-1] %= 1000000000;
if(c.s[i+j-1]) c.len = max(c.len,i+j-1);
}
}
return c;
}
it operator / (it a,int b) {
it c; LL m = 0;
for(int i = a.len;i > 0;i --) {
m = m * 1000000000 + a.s[i];
c.s[i] = m / b;
m %= b;
if(c.s[i]) c.len = max(c.len,i);
}
return c;
}
int zxy;
LL n,m,i,j,s,o,k,ans;
LL gcd(LL a,LL b) {
return b == 0 ? a : gcd(b,a % b);
}
LL qkpow(LL a,LL b) {
LL res = 1;
while(b) {
if(b & 1) res = res * a;
b >>= 1; a = a * a;
}
return res;
}
it qkpow(it a,LL b) {
it res(1);
while(b) {
if(b & 1) res = res * a;
b >>= 1; a = a * a;
}
return res;
}
it dp[35][35];
bool vis[35][35];
signed main() {
while(scanf("%d%d",&n,&m) == 2) {
if(vis[n][m]) {
dp[n][m].print();
ENDL;
continue;
}
it ans;
it M(m);
ans = (qkpow(M,n * n));
ans = ans + (qkpow(M,(n & 1) ? ((n * n - 1) / 4 + 1) : (n * n / 4)) * it(2));
ans = ans + (qkpow(M,(n & 1) ? ((n * n - 1) / 2 + 1) : (n * n / 2)));
ans = ans + (qkpow(M,(n & 1) ? (n * (n+1) / 2) : (n * n / 2)) * it(2));
ans = ans + (qkpow(M,n * (n+1) / 2) * it(2));
ans = ans / 8;
ans.print();
dp[n][m] = ans;
vis[n][m] = 1;
ENDL;
}
return 0;
}

[HDU1812] Count the Tetris - 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. polya定理小结

    polya的精髓就在与对循环节的寻找,其中常遇到的问题就是项链染色类问题. 当项链旋转时有n种置换,循环节的个数分别是gcd(n, i); 当项链翻转时有n种置换,其中当项链珠子数位奇数时,循环节的个 ...

随机推荐

  1. python爬虫之企某科技JS逆向

    python爬虫简单js逆向案例在学习时需要用到数据,学习了python爬虫知识,但是在用爬虫程序的时候就遇到了问题.具体如下,在查看请求数据时发现返回的数据是加密的信息,现将处理过程记录如下,以便大 ...

  2. pytorch 中 repeat 和 expend 的功能和区别

    功能 均是用于扩展张量的维度 区别 tensor.expand(*sizes) 将张量中单维度(singleton dimensions,即张量在某个维度上为1的维度,exp(1,2,3),其中在第一 ...

  3. Mysql中的小技巧

    1.where 字段名 regexp '正则表达式' 正则符号: ^ $ . [ ] * | . 表示1个任意字符 * 表示前面重复0次,或者任意次 ^ 开始 $ 结尾 [] 范围 | 或 sql示例 ...

  4. 程序分析与优化 - 9 附录 XLA的缓冲区指派

    本章是系列文章的案例学习,不属于正篇,主要介绍了TensorFlow引入的XLA的优化算法.XLA也有很多局限性,XLA更多的是进行合并,但有时候如果参数特别多的场景下,也需要进行分割.XLA没有数据 ...

  5. RT-Thread 组件 FinSH 使用时遇到的问题

    一.FinSH 的移植与使用问题 FinSH组件输入无反应的问题 现象:当打开 finsh 组件后,控制台会打相应的信息,如下图说是: \ | / - RT - Thread Operating Sy ...

  6. 史上最全学习率调整策略lr_scheduler

    学习率是深度学习训练中至关重要的参数,很多时候一个合适的学习率才能发挥出模型的较大潜力.所以学习率调整策略同样至关重要,这篇博客介绍一下Pytorch中常见的学习率调整方法. import torch ...

  7. 高精度10m/30米NPP净初级生产力分布数据

    数据下载链接:百度云下载链接​ 引言 第一性生产力是绿色植物呼吸后所剩下的单位面积单位时间内所固定的能量或所生产的有机物质,即是总第一性生产量减去植物呼吸作用所剩下的能量或有机物质.多种卫星遥感数据反 ...

  8. 数组容器(ArrayList)设计与Java实现,看完这个你不懂ArrayList,你找我!!!

    数组容器(ArrayList)设计与Java实现 本篇文章主要跟大家介绍我们最常使用的一种容器ArrayList.Vector的原理,并且自己使用Java实现自己的数组容器MyArrayList,让自 ...

  9. android studio 初印象

    ANSROID STUDIO sdk 目录 build-tools目录,存放各版本Android的各种编译工具. docs目录,存放开发说明文档. extras\android目录,存放兼容低版本的新 ...

  10. CSS进阶内容—盒子和阴影详解

    CSS进阶内容 在学习了CSS基本知识之后,我们需要进一步了解CSS,因此写下了这篇文章 当然如果没有学习之前的知识,可以到我的主页中查看之前的文章:秋落雨微凉 - 博客园 CSS三大特性 首先我们先 ...