这道题考察的是组合计数(用Burnside,当然也可以认为是Polya的变形,毕竟Polya是Burnside推导出来的)。

这一类问题的本质是计算置换群(A,P)中不动点个数!(所谓不动点,是一个二元组(a,p),a∈A,p∈P ,使得p(a)=a,即a在置换p的作用后还是a)。

Polya定理其实就是告诉了我们一类问题的不动点数的计算方法。

对于Burnside定理的考察,我见过的有以下几种形式(但归根结底还是计算不动点数):

  1、限制a(a∈A)的特点,本题即是如此(限制了各颜色个数,可以用DP来统计(以前我们直接用c^k来计算某置换的不动点,c是颜色总数,k是循环节个数))

  2、让P的数量高出暴力的范围,(比如经典的项链染色问题,或者P就是一个对称群(包含所有置换)),此时就必须寻找数学规律,不能硬来。项链染色这种可以用欧拉函数优化;对于图的同构计数(它的置换群是一个对称群),先将置换按照其格式分类(见《组合数学》,可以想象具有相同格式的置换的不动点也是相同的),然后再观察某一特定格式的置换的不动点数是多少(是有规律的)。

注:应用定理解题时要保证置换成群,本题中,结合律是肯定的,输入说明中已经说了,该置换集合满足:封闭性,逆元,所以我们自己再添一个单位元((1)(2)...(m))就行了。

 /**************************************************************
Problem: 1004
User: idy002
Language: C++
Result: Accepted
Time:116 ms
Memory:844 kb
****************************************************************/ #include <cstdio>
#include <cstring>
#define maxn 65
using namespace std; int mpow( int a, int b, int n ) {
a %= n;
int rt;
for( rt=; b; b>>=,a=(a*a)%n )
if( b& ) rt=(rt*a)%n;
return rt;
}
int inv( int a, int n ) {
return mpow(a,n-,n);
} int sp[maxn], tot;
bool vis[maxn];
void split( int n, int *a ) {
tot = ;
memset( vis, , sizeof(vis) );
for( int i=; i<=n; i++ ) {
if( vis[i] ) continue;
tot++;
sp[tot] = ;
int cur = i;
do {
sp[tot]++;
vis[cur] = true;
cur = a[cur];
} while( !vis[cur] );
}
} int n, sr, sg, sb, m, p, ans;
int a[maxn];
int dp[][][]; int dodp() {
memset( dp, , sizeof(dp) );
dp[][][] = ;
for( int i=; i<=tot; i++ ) {
int sz = sp[i];
for( int r=sr; r>=; r-- )
for( int g=sg; g>=; g-- )
for( int b=sb; b>=; b-- ) {
int & dv = dp[r][g][b];
dv = ;
if( r>=sz ) dv += dp[r-sz][g][b];
if( g>=sz ) dv += dp[r][g-sz][b];
if( b>=sz ) dv += dp[r][g][b-sz];
dv %= p;
}
}
return dp[sr][sg][sb];
}
void update( int n, int *a ) {
split(n,a);
ans += dodp();
if( ans>p ) ans -= p;
} int main() {
scanf( "%d%d%d%d%d", &sr, &sg, &sb, &m, &p );
n = sr+sg+sb;
for( int i=; i<=m; i++ ) {
for( int j=; j<=n; j++ )
scanf( "%d", a+j );
update(n,a);
} for( int i=; i<=n; i++ )
a[i] = i;
update(n,a); ans *= inv(m+,p);
ans %= p;
printf( "%d\n", ans );
}

推荐文章:

陈瑜希 《Pólya计数法的应用》

符文杰 《Pólya原理及其应用》

bzoj 1004 Cards 组合计数的更多相关文章

  1. bzoj 1004 Cards

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

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

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

  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 2655 calc (组合计数、DP、多项式、拉格朗日插值)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2655 题解 据说有一种神仙容斥做法,但我不会. 以及貌似网上大多数人的dp和我的做法都不 ...

  6. BZOJ 3456 城市规划 (组合计数、DP、FFT)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3456 著名的多项式练习题,做法也很多,终于切掉了纪念 首先求一波递推式: 令\(F(n ...

  7. bzoj 2281 [Sdoi2011]黑白棋(博弈+组合计数)

    黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色 ...

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

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

  9. BZOJ 4555: [Tjoi2016&Heoi2016]求和 [分治FFT 组合计数 | 多项式求逆]

    4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...

随机推荐

  1. redis中插入用户集合的语句,有四个属性

    一.redis 数据结构使用场景 原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 ...

  2. WHY学习python?

    1.python更容易上手 2.功能库很多,不用重复造轮子 3.能干的事情很多(网站开发,爬虫,自动化运维,数据分析,游戏开发,人工智能) 网站开发:豆瓣,知乎 网站框架:django (姜狗) py ...

  3. Cesium 初始化Viewer

    <pre name="code" class="javascript"><script> var viewer = new Cesium ...

  4. 64_p5

    php-nette-bootstrap-2.4.3-1.fc26.noarch.rpm 20-Feb-2017 07:19 16290 php-nette-caching-2.5.3-1.fc26.n ...

  5. React 16 源码瞎几把解读 【三 点 一】 把react组件对象弄到dom中去(矛头指向fiber,fiber不解读这个过程也不知道)

    一.ReactDOM.render 都干啥了 我们在写react的时候,最后一步肯定是 ReactDOM.render( <div> <Home name="home&qu ...

  6. Python连接Access数据库

    前言 今天想要用Python访问Access数据库,折腾了半天,特记录一下 背景 最近想将一些文件记录下来,存入数据库,为此拿LabVIEW写了一个版本,记录环境配置为: LabVIWE:2015 A ...

  7. Ubuntu下安装Sublime Text3

    1. 下载软件 Ctrl+Alt+T 调出命令窗口执行下面命令下载安装包: sudo add-apt-repository ppa:webupd8team/sublime-text-3 2. 更新软件 ...

  8. 20165301 2017-2018-2 《Java程序设计》第二周学习总结

    20165301 2017-2018-2 <Java程序设计>第二周学习总结 教材学习内容总结 第二章:基本数据类型与数组 标识符 第一个字符不能是数字 不能是关键字 不能是true.fa ...

  9. 如何提交代码到CEPH Repo。 顺便庆祝下,提交了第一个ceph pull request。实现了从0到1的突破

    庆祝一下!经过社区老司机的带路,昨天提交了第一个ceph pull request.实现了从0到1的突破,希望再接再厉提交更多代码到社区,为社区发展贡献一点自己力量. 提交的第一个被社区fix的bug ...

  10. 向SD卡写入树莓派的操作系统

    这是 meelo 原创的 玩转树莓派 系列文章 用到的工具: Win32 Disk Imager: sd卡读卡器  Raspbian操作系统镜像:下载地址 步骤1:下载操作系统的镜像 树莓派基金会的网 ...