bzoj 1004 Cards 组合计数
这道题考察的是组合计数(用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 组合计数的更多相关文章
- bzoj 1004 Cards
1004: [HNOI2008]Cards Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有 多少种染色方案,Sun ...
- BZOJ 1004 Cards(Burnside引理+DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1004 题意:三种颜色的扑克牌各有Sr,Sb,Sg张.给出m种置换.两种染色方案在某种置换 ...
- bzoj 1004 Cards & poj 2409 Let it Bead —— 置换群
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1004 关于置换群:https://www.cnblogs.com/nietzsche-oie ...
- BZOJ 1004 Cards(Burnside引理+DP)
因为有着色数的限制,故使用Burnside引理. 添加一个元置换(1,2,,,n)形成m+1种置换,对于每个置换求出循环节的个数, 每个循环节的长度. 则ans=sigma(f(i))/(m+1) % ...
- BZOJ 2655 calc (组合计数、DP、多项式、拉格朗日插值)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2655 题解 据说有一种神仙容斥做法,但我不会. 以及貌似网上大多数人的dp和我的做法都不 ...
- BZOJ 3456 城市规划 (组合计数、DP、FFT)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3456 著名的多项式练习题,做法也很多,终于切掉了纪念 首先求一波递推式: 令\(F(n ...
- bzoj 2281 [Sdoi2011]黑白棋(博弈+组合计数)
黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色 ...
- [BZOJ 1004] [HNOI2008] Cards 【Burnside引理 + DP】
题目链接:BZOJ - 1004 题目分析 首先,几个定义和定理引理: 群:G是一个集合,*是定义在这个集合上的一个运算. 如果满足以下性质,那么(G, *)是一个群. 1)封闭性,对于任意 a, b ...
- 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是第二类斯特林 ...
随机推荐
- Git其他的命令------(四)
git除了在工作当中可以进行对代码进行管理的设置之外,git的其他指令也偶尔会被用到~ 1:删除某一个文件: rm -rf node,然后按下tab 2:查看修改文件的修改的详细信息: git ...
- 深入理解C指针----学习笔记
深入理解C指针 第1章 认识指针 理解指针的关键在于理解C程序如何管理内存,指针包含的就是内存地址. 1.1 指针和内存 C程序在编译后,以三种方式使用内存: 1. 静态. ...
- docker之设置开机自启动(二)
docker的自启动 通过sysv-rc-conf等管理 启动脚本 # docker.service #!/bin/sh sudo systemctl enable docker sudo syste ...
- 32.Longest Valid Parentheses---dp
题目链接:https://leetcode.com/problems/longest-valid-parentheses/description/ 题目大意:找出最长的括号匹配的子串长度.例子:&qu ...
- 011 CountDownLatch,CyclicBarrier和Semaphore
CountDownLatch(闭锁,有译倒计数,锁寄存): public class CountDownLatchTest { /*** 比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此 ...
- MySQL 操作总结
1. 数据库级别操作 1.1 创建数据库 CREATE DATABASE db1 default charset utf8 collate utf8_general_ci; 1.2 删除数据库 DRO ...
- hive学习(五) 应用案例
1.实现struct数据结构例子 1.1创建student表 create table student( id int, info struct<name:string,age:int> ...
- csv 文件乱码问题
问题背景: Pandas.DataFrame 数据结构df在调用df.to_csv()方法生成csv文件格式的字符串(调用df.to_csv('test.csv')直接生成文件也有这个问题)作为字符串 ...
- [BZOJ3150][Ctsc2013]猴子 期望dp+高斯消元
3150: [Ctsc2013]猴子 Time Limit: 20 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 163 Solved: 10 ...
- poj1475 Pushing Boxes(BFS)
题目链接 http://poj.org/problem?id=1475 题意 推箱子游戏.输入迷宫.箱子的位置.人的位置.目标位置,求人是否能把箱子推到目标位置,若能则输出推的最少的路径,如果有多条步 ...