1004: [HNOI2008]Cards

Description

小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有

多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红色,Sb张蓝色,Sg张绝色.他又询问有多少种方

案,Sun想了一下,又给出了正确答案. 最后小春发明了M种不同的洗牌法,这里他又问Sun有多少种不同的染色方案.

两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用多种洗牌法,而每种方法可以使用多次)洗

成另一种.Sun发现这个问题有点难度,决定交给你,答案可能很大,只要求出答案除以P的余数(P为质数).

Input

第一行输入5个整数:Sr,Sb,Sg,m,p(m<=60,m+1<p<100)。n=Sr+Sb+Sg。接下来m行,每行描述一种洗牌法,每行有n个用空格隔开的整数X1X2...Xn,恰为1到n的一个排列,表示使用这种洗牌法,第i位变为原来的Xi位的牌。输入数据保证任意多次洗牌都可用这m种洗牌法中的一种代替,且对每种洗牌法,都存在一种洗牌法使得能回到原状态。

Output

不同染法除以P的余数

Sample Input

1 1 1 2 7

2 3 1

3 1 2

Sample Output

2

HINT

有2 种本质上不同的染色法RGB 和RBG,使用洗牌法231 一次可得GBR 和BGR,使用洗牌法312 一次可得BRG 和GRB。

100%数据满足 Max{Sr,Sb,Sg}<=20。

题解

此题我一开始看,没有半点思路,还以为是图论。后来,我去搜题解,说是裸题。当时我就怒了,觉得自己连裸题都做不出来。怼了好久之后怂了,又去看题解,群论裸题

首先此题需要burnside定理,即在集合\(X\)上的群\(G\),对于\(g \in G\),令\(X^g\)为在\(g\)作用下的不动元素,有\(|X/G|={1 \over {|G|}} \sum_{g \in G}|X^g|\)。

在此题中就可以得出\(Ans = \sum Cal(change_i) * |G|^{-1}\),其中\(Cal\)计算每种置换的方案数。

Ps:

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N = 65, M = 105;
int n, m, p, sr, sb, sg;
int dp[N][N][N], cha[M][N], d[N];
bool vis[N];
#define Inc(a,b) ((a) = ((a) + (b))%p)
int Cal(const int &x) {
memset(dp, 0, sizeof dp);
memset(vis, 0, sizeof vis);
int Sum = 0, t;
for (int i = 1; i <= n; ++i)
if (!vis[i]) {
d[++Sum] = 1; vis[t = i] = true;
while (!vis[cha[x][t]]) {
++d[Sum]; t = cha[x][t];
vis[t] = true;
}
}
dp[0][0][0] = 1;
for (t = 1; t <= Sum; ++t)
for (int i = sr; ~i; --i)
for (int j = sb; ~j; --j)
for (int k = sg; ~k; --k) {
if (i >= d[t]) Inc(dp[i][j][k], dp[i-d[t]][j][k]);
if (j >= d[t]) Inc(dp[i][j][k], dp[i][j-d[t]][k]);
if (k >= d[t]) Inc(dp[i][j][k], dp[i][j][k-d[t]]);
}
//printf("%d\n", dp[sr][sb][sg]);
return dp[sr][sb][sg];
} long long Mod_Pow(long long b, int c) {
long long ans = 1LL;
while (c) {
if (c&1) ans = ans * b % p;
b = b * b % p;
c >>= 1;
}
return ans;
} int main() {
scanf("%d%d%d%d%d", &sr, &sb, &sg, &m, &p);
n = sr + sb + sg;
for (int i = 1; i <= m; ++i)
for (int j = 1; j <= n; ++j)
scanf("%d", cha[i] + j);
++m;
long long ans = 0;
for (int i = 1; i <= n; ++i) cha[m][i] = i;
for (int i = 1; i <= m; ++i) Inc(ans, Cal(i));
//printf("%d\n", ans);
ans = ans * Mod_Pow(m, p - 2) % p;
printf("%lld\n", ans);
return 0;
}

bzoj 1004 Cards的更多相关文章

  1. BZOJ 1004 Cards(Burnside引理+DP)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1004 题意:三种颜色的扑克牌各有Sr,Sb,Sg张.给出m种置换.两种染色方案在某种置换 ...

  2. bzoj 1004 Cards 组合计数

    这道题考察的是组合计数(用Burnside,当然也可以认为是Polya的变形,毕竟Polya是Burnside推导出来的). 这一类问题的本质是计算置换群(A,P)中不动点个数!(所谓不动点,是一个二 ...

  3. bzoj 1004 Cards & poj 2409 Let it Bead —— 置换群

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1004 关于置换群:https://www.cnblogs.com/nietzsche-oie ...

  4. BZOJ 1004 Cards(Burnside引理+DP)

    因为有着色数的限制,故使用Burnside引理. 添加一个元置换(1,2,,,n)形成m+1种置换,对于每个置换求出循环节的个数, 每个循环节的长度. 则ans=sigma(f(i))/(m+1) % ...

  5. [BZOJ 1004] [HNOI2008] Cards 【Burnside引理 + DP】

    题目链接:BZOJ - 1004 题目分析 首先,几个定义和定理引理: 群:G是一个集合,*是定义在这个集合上的一个运算. 如果满足以下性质,那么(G, *)是一个群. 1)封闭性,对于任意 a, b ...

  6. bzoj 1004 [HNOI2008]Cards && poj 2409 Let it Bead ——置换群

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1004 http://poj.org/problem?id=2409 学习材料:https:/ ...

  7. bzoj 1004 1004: [HNOI2008]Cards burnside定理

    1004: [HNOI2008]Cards Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1668  Solved: 978[Submit][Stat ...

  8. BZOJ 1004: [HNOI2008]Cards( 置换群 + burnside引理 + 背包dp + 乘法逆元 )

    题意保证了是一个置换群. 根据burnside引理, 答案为Σc(f) / (M+1). c(f)表示置换f的不动点数, 而题目限制了颜色的数量, 所以还得满足题目, 用背包dp来计算.dp(x,i, ...

  9. 【BZOJ 1004】 1004: [HNOI2008]Cards (置换、burnside引理)

    1004: [HNOI2008]Cards Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很 ...

随机推荐

  1. 【从零开始学习Hadoop】--1.Hadoop的安装

    第1章 Hadoop的安装1. 操作系统2. Hadoop的版本3. 下载Hadoop4. 安装Java JDK5. 安装hadoop6. 安装rsync和ssh7. 启动hadoop8. 测试had ...

  2. ORACLE 10g 数据库体系结构图

    ORACLE 10g 的数据库体系结构图(ORACLE 10g(Release 2)ARCHITECTURE),非常的全面.系统.高屋建瓴的整体介绍了ORACLE 10g 的数据库体系结构.如果能全面 ...

  3. [转载]Linux 线程实现机制分析

    本文转自http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 支持原创.尊重原创,分享知识! 自从多线程编程的概念出现在 Linux ...

  4. T-SQL查看数据库恢复(RESTORE)时间

    WITH LastRestores AS ( SELECT DatabaseName = [d].[name] , [d].[create_date] , [d].[compatibility_lev ...

  5. Python正则表达式:最短匹配

    最短匹配应用于:假如有一段文本,你只想匹配最短的可能,而不是最长. 例子 比如有一段html片段,'\this is first label\\the second label\',如何匹配出每个a标 ...

  6. JavaScript的写类方式(6)

    时间到了2015年6月18日,ES6正式发布了,到了ES6,前面的各种模拟类写法都可以丢掉了,它带来了关键字 class,extends,super. ES6的写类方式 // 定义类 Person c ...

  7. ELF Format 笔记(十一)—— 程序头结构

    ilocker:关注 Android 安全(新手) QQ: 2597294287 程序头表 (program header table) 是一个结构体数组,数组中的每个结构体元素是一个程序头 (pro ...

  8. windows 2003自动登录的具体步骤

    在win2003系统中,使用最多的可能就是远程操作了,关于远程操作的那些事很多用户还是有些迷茫的.如果win2003系统远程重启后,要重新登录系统十分的麻烦,如何才能实现重启后的自动登录呢?让高手告诉 ...

  9. mybatic与spring结合的事务管理

    原文地址:http://czj4451.iteye.com/blog/2037759 mybatis与spring结合后,事务管理更加方便,这里介绍使用transactionnal的方式,有错的的地方 ...

  10. RS-232, RS-422, RS-485 Serial Communication General Concepts(转载)

    前面转载的几篇文章重点介绍了UART及RS-232.在工控领域除了RS-232以外,常用的串行通信还有RS-485.本文转载的文章重点介绍了RS-232.RS-422和RS-485. Overview ...