题面

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. OpenCloudOS使用snap安装.NET 6

    开源操作系统社区 OpenCloudOS 由腾讯与合作伙伴共同倡议发起,是完全中立.全面开放.安全稳定.高性能的操作系统及生态.OpenCloudOS 沉淀了多家厂商在软件和开源生态的优势,继承了腾讯 ...

  2. WinSCP和PuTTY的安装和使用

    简介 WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端.同时支持SCP协议.它的主要功能就是在本地与远程计算机间安全的复制文件. 安装 1.下载地址:https://www. ...

  3. Windows启动谷歌浏览器Chrome失败(应用程序无法启动,因为应用程序的并行配置不正确)解决方法

    目录 一.系统环境 二.问题描述 三.解决方法 一.系统环境 Windows版本 系统类型 浏览器Chrome版本 Windows 10 专业版 64 位操作系统, 基于 x64 的处理器 版本 10 ...

  4. Android Studio 的初次使用

    记录我第一次使用Android Studio时遇到的问题以及一些简单的笔记. 我所使用的是Android Studio 2.2版本 遇到的问题 创建一个Hello World!项目无疑是相当简单的,我 ...

  5. Linux操作系统(7):rpm包管理和yum软件包在线管理

    一.rpm 包的管理 介绍:一种用于互联网下载包的打包及安装工具,它包含在某些 Linux 分发版中.它生成具有.RPM 扩展名的文件.RPM 是 RedHat Package Manager(Red ...

  6. 一文深入浅出学习Spring框架系列,强烈推荐

    本系列主要介绍Spring框架整体架构,Spring的核心IOC,AOP的案例和具体实现机制:以及SpringMVC框架的案例和实现机制.@pdai 相关文章 首先, 从Spring框架的整体架构和组 ...

  7. Node.js精进(9)——性能监控(上)

    市面上成熟的 Node.js 性能监控系统,监控的指标有很多. 以开源的 Easy-Monitor 为例,在系统监控一栏中,指标包括内存.CPU.GC.进程.磁盘等. 这些系统能全方位的监控着应用的一 ...

  8. 常用的函数式接口_Predicate接口_默认方法and和Predicate接口练习_集合接口筛选

    默认方法:and 既然是条件判断,就会存在与.或.非三种常见的逻辑关系.其中将两个Preadicate条件使用"与"逻辑连接起来实现"并且"的效果时,可以使用d ...

  9. 记一次 .NET 某RFID标签管理系统 CPU 暴涨分析

    一:背景 1. 讲故事 前段时间有位朋友说他的程序 CPU 出现了暴涨现象,由于程序是买来的,所以问题就比较棘手了,那既然找到我,就想办法帮朋友找出来吧,分析下来,问题比较经典,有必要和大家做一下分享 ...

  10. else语句

    else的搭配 与else语句配合使用有三种情况 if ...: else: if条件表达式不成立的时候执行else 注意else还可以与while循环和for循环组合在一起(这是一个全新的知识) 注 ...