BZOJ1004 HNOI Cards
第一次学习置换群这个东西。
这题需要利用Burnside定理。
即我们求出循环节为一(转完不变)的个数的平均数也就是等价类的个数。
定义:设G={a1,a2,…ag}是目标集[1,n]上的置换群。每个置换都写成不相交循环的乘积。 c1(ak) 是在置换ak 的作用下不动点的个数,也就是长度为1的循环的个数(其实就是被置换ak 置换过后位置不变的元素个数)。通过上述置换的变换操作后可以相等的元素属于同一个等价类。若G将[1,n]划分成L个等价类,则:

证明:http://blog.csdn.net/gengmingrui/article/details/50564027
这样我们就相当于求每一种置换有多少不同的使得转完后不变的方案数,利用01背包可求。
而转完不变的意思就是转完后颜色还是原来的颜色。
然后答案是在mod p意义下的所以要用逆元。
By:大奕哥
#include<bits/stdc++.h>
using namespace std;
int sr,sb,sg,m,p,n;
int e[][],size[],f[][][];
bool v[];
int dp(int x)
{
memset(f,,sizeof(f));
memset(size,,sizeof(size));
memset(v,,sizeof(v));
int cnt=;
for(int i=;i<=n;++i)
{
if(v[i])continue;
cnt++;int p=e[x][i];
while(!v[p])size[cnt]++,v[p]=,p=e[x][p];
}
f[][][]=;
for(int i=;i<=cnt;++i)
for(int SR=sr;SR>=;SR--)
for(int SB=sb;SB>=;SB--)
for(int SG=sg;SG>=;SG--)
{
if(SR>=size[i])f[SR][SB][SG]=(f[SR][SB][SG]+f[SR-size[i]][SB][SG])%p;
if(SB>=size[i])f[SR][SB][SG]=(f[SR][SB][SG]+f[SR][SB-size[i]][SG])%p;
if(SG>=size[i])f[SR][SB][SG]=(f[SR][SB][SG]+f[SR][SB][SG-size[i]])%p;
}
return f[sr][sb][sg];
}
int quick_mod(int a,int b)
{
int ans=;
while(b)
{
if(b&)ans=ans*a%p;
a=a*a%p;b>>=;
}
return ans;
}
int main()
{
scanf("%d%d%d%d%d",&sr,&sb,&sg,&m,&p);n=sb+sr+sg;
for(int i=;i<=m;++i)
for(int j=;j<=n;++j)
scanf("%d",&e[i][j]);
++m;int ans=;
for(int i=;i<=n;++i)e[m][i]=i;
for(int i=;i<=m;++i)
ans=(ans+dp(i))%p;
ans=(ans*quick_mod(m,p-))%p;
printf("%d\n",ans);
return ;
}
BZOJ1004 HNOI Cards的更多相关文章
- 【BZOJ1004】Cards(组合数学,Burnside引理)
[BZOJ1004]Cards(组合数学,Burnside引理) 题面 Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Su ...
- [BZOJ1004](HNOI 2008) Cards
Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目 前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张 ...
- bzoj1004 [HNOI2008]Cards 置换群+背包
[bzoj1004][HNOI2008]Cards 2014年5月26日5,3502 Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿 ...
- [BZOJ1004] [HNOI2008]Cards解题报告(Burnside引理)
Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红 ...
- BZOJ1004 [HNOI2008]Cards 【burnside定理 + 01背包】
题目链接 BZOJ1004 题解 burnside定理 在\(m\)个置换下本质不同的染色方案数,等于每种置换下不变的方案数的平均数 记\(L\)为本质不同的染色方案数,\(m\)为置换数,\(f(i ...
- BZOJ1004: [HNOI2008]Cards
三维01背包算出在每一个置换下不变的染色方案数,Burnside引理计算答案. PS:数据太水所以只算恒等置换也是可以过的. #include<bits/stdc++.h> using n ...
- BZOJ1004 [HNOI2008]Cards(Polya计数)
枚举每个置换,求在每个置换下着色不变的方法数,先求出每个循环的大小,再动态规划求得使用给定的颜色时对应的方法数. dp[i][j][k]表示处理到当前圈时R,B,G使用量为i,j,k时的方法数,背包思 ...
- [BZOJ1004] [HNOI2008] Cards (Polya定理)
Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红 ...
- BZOJ1004 HNOI2008 Cards Burnside、背包
传送门 在没做这道题之前天真的我以为\(Polya\)可以完全替代\(Burnside\) 考虑\(Burnside\)引理,它要求的是对于置换群中的每一种置换的不动点的数量. 既然是不动点,那么对于 ...
随机推荐
- 蓝色的oa模板html_综合信息服务管理平台OA模板——后台
链接:http://pan.baidu.com/s/1qXGGOAK 密码:2otu
- wget下载整个网站或特定目录
下载整个网站或特定目录 wget -c -k -r -np -p http://www.yoursite.com/path -c, –continue 断点下载 -k, –convert-links ...
- Ubuntu 上更新 Flash 插件
2018-02-19 12:08:28 更新: 现在的 Google Chrome 浏览器自带了 Flash 支持,无需安装.而 Firefox 浏览器没有提供 Flash 支持,所以用 Firefo ...
- 使用linux下的C操作SQLLITE
from: http://baike.so.com/doc/1529694.html 由于Linux下侧重使用命令,没有win的操作容易上手,所以在测试C操作SQLITE时会比较容易出现错误,给大家做 ...
- 在C#中用MediaInfo获取视频或音频的属性
MediaInfo是一个开源的获取视频或音频的信息的非常便利的工具,它本身就带有一个GUI界面,可以非常方便我们查看视频信息.但是,当我们写一些转码程序时,往往需要在程序中获取视频信息的时候. 以前我 ...
- .htaccess技巧: URL重写(Rewrite)与重定向(Redirect)
URL重定向是.htaccess的重头戏,它可以将长地址转为短地址.将动态地址转为静态地址.重定向丢失的页面.防止盗链.实现自动语言转换等.笔者觉得难点是在正则表达式的运用和理解上. 实现所有这些神奇 ...
- 千万不要运行的 Linux 命令
本文中列出的命令绝对不可以运行,即使你觉得很好奇也不行,除非你是在虚拟机上运行(出现问题你可以还原),因为它们会实实在在的破坏你的系统.所以不在root等高级管理权限下执行命令是很好的习惯. 本文的目 ...
- java基础8 构造函数和构造代码块
一.构造函数 1 构造函数的作用 给对应的对象进行初始化. 2 构造函数的格式 修饰符 函数名(形式参数){ //函数名就是类名 函数体 } 举例说明: class Perosn{ private i ...
- ntp 校时程序
//effect:send ntp packet and get the ntp packet ,make the time OK//2014.7.31 is OK//#include <sys ...
- leetcode 之Median of Two Sorted Arrays(五)
找两个排好序的数组的中间值,实际上可以扩展为寻找第k大的数组值. 参考下面的思路,非常的清晰: 代码: double findMedianofTwoSortArrays(int A[], int B[ ...