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. #研发解决方案介绍#基于StatsD+Graphite的智能监控解决方案

    郑昀 基于李丹和刘奎的文档 创建于2014/12/5 关键词:监控.dashboard.PHP.graphite.statsd.whisper.carbon.grafana.influxdb.Pyth ...

  2. ORACLE关闭启动的诡异错误

    在自己虚拟机搭建的ORACLE数据库环境下,折腾捣鼓做实验时,不知道什么特殊的改动.操作导致从SQL*PLUS里启动数据库实例时,报如下错误: 然后用startup nomout启动时,任然报ORA- ...

  3. Echarts 之二——地市联动数据统计

    一.简介 通过地图可以更直观地展示各个地区的统计数据,能够更清楚地进行数据分析.有些场景下,我们不仅仅需要对每个地市进行统计分析.更需要对地市一下的区县进行数据统计,并进行联动.此事我们可以通过Ech ...

  4. Spark调度管理(读书笔记)

    Spark调度管理(读书笔记) 转载请注明出处:http://www.cnblogs.com/BYRans/ Spark调度管理 本文主要介绍在单个任务内Spark的调度管理,Spark调度相关概念如 ...

  5. allocation size overflow

    var cityID="1"; var areaHtml=""; var storeHtml=""; //区域异步 function Get ...

  6. ubuntu与centos安装软件的不同点总结

    ubuntu与redhat系列的linux操作系统安装软件区别是很大的.下表列出了两者之间的对比.

  7. eclipse svn账号更换

    在eclipse下用 svn的时候,我们习惯将用户名和密码保存.前天公司将svn的账号全部更换了,这时原来的eclipse保存的svn账号密码就失效了.那怎么样才能切换账号了,eclipse svn插 ...

  8. Redmine 插件安装

    将对应的插件都复制进redmine的plugins 安装对应所需要的GEMS bundle install --without development test rmagick 执行插件合并 bund ...

  9. java笔记

    ANT概述:http://www.blogjava.net/amigoxie/archive/2007/11/09/159413.html http://baitai.iteye.com/blog/7 ...

  10. ASP.NET Core--根据方案来限制身份

    翻译如下: 在某些情况下,比如单页的应用程序,可以与多种认证来方式结合.例如,您的应用程序可能使用基于Cookie的身份验证来登录和JavaScript的请求承载认证.在某些情况下,可能一个授权验证的 ...