bzoj1004
等价类计数问题首先要构造出群
首先,给出的洗牌法就相当于置换,
再加上置换(1)(2)(3)……(n),可以构成一个包含m+1个置换的置换群;
这里要解释一下构成置换群的四个条件
封闭性 任意两个置换相乘所得的置换还在群内 题目中已经给定保证任意多次洗牌都可用这m种洗牌法中的一种代替
结合性 显然置换相乘本身就满足结合律
单位元 存在一个单位元e是的a*e=a成立,显然置换(1)(2)(3)……(n)就是这样一个单位元
逆元 任意一个置换a都存在一个置换b使得a*b=e 这是有题目给定条件对每种洗牌法,都存在一种洗牌法使得能回到原状态。
这样置换群就弄出来了,然后就是根据Burnside引理,找出每个置换不动点的个数
每个置换可以拆成多个不相交的循环的积,不动点就要求每个循环内元素颜色相同
由于颜色存在数量限制,不能用polya求,只能用dp求出
最后注意求平均数设计到除法取模,我们还要求m+1的乘法逆元
var s,r:array[..] of longint;
f:array[..,..,..] of longint;
ans,x,y,i,j,n,m,a,b,c,p,t:longint;
v:array[..] of boolean; procedure exgcd(a,b:longint;var x,y:longint);
var xx,yy:longint;
begin
if b= then
begin
x:=;
y:=;
end
else begin
exgcd(b,a mod b,x,y);
xx:=x;
yy:=y;
x:=yy;
y:=xx-a div b*yy;
end;
end; function calc(n:longint):longint;
//f[i,j,k]表示到第i个循环,红色用了j次,蓝色用了k次,由于每个循环内颜色相同,所以绿色用的次数可以根据i,j,k算出
var t,i,j,k:longint;
begin
f[,,]:=;
t:=;
for i:= to n do
begin
t:=t+s[i];
for j:= to a do
for k:= to b do
begin
f[i,j,k]:=;
x:=t-j-k;
if (x>c) then continue;
if x< then break;
if j>=s[i] then f[i,j,k]:=(f[i,j,k]+f[i-,j-,k]) mod p; //要涂就一定要足够涂满循环内全部元素
if k>=s[i] then f[i,j,k]:=(f[i,j,k]+f[i-,j,k-]) mod p;
if x>=s[i] then f[i,j,k]:=(f[i,j,k]+f[i-,j,k]) mod p;
end;
end;
exit(f[n,a,b]);
end; begin
readln(a,b,c,m,p);
n:=a+b+c;
for i:= to n do
s[i]:=;
ans:=calc(n);
for i:= to m do
begin
for j:= to n do
read(r[j]);
fillchar(v,sizeof(v),false);
fillchar(s,sizeof(s),);
t:=;
for j:= to n do
if not v[j] then
begin
x:=j;
inc(t);
while not v[x] do
begin
v[x]:=true;
inc(s[t]); //统计循环规模
x:=r[x];
end;
end;
ans:=(ans+calc(t)) mod p;
end;
x:=;
y:=;
exgcd(m+,p,x,y);
writeln(ans*(x+p) mod p); //注意通过扩展欧几里得求出的乘法逆元可能是负数
end.
bzoj1004的更多相关文章
- 【bzoj1004】 HNOI2008—Cards
http://www.lydsy.com/JudgeOnline/problem.php?id=1004 (题目链接) 题意 n张卡片,染成3种颜色,每种颜色只能染固定张数.给出一些洗牌方案,问染色方 ...
- 【BZOJ1004】Cards(组合数学,Burnside引理)
[BZOJ1004]Cards(组合数学,Burnside引理) 题面 Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Su ...
- BZOJ1004 HNOI2008Cards(Burnside引理+动态规划)
直接给了一个置换群(当然要自己手动加上不洗牌的情况).考虑求不动点数量即可.对于一个置换,求出所有循环的长度,然后设f[i][x][y]为给前i个循环着色后,用了x张红色卡片.y张绿色卡片的方案数,d ...
- 【BZOJ1004】[HNOI2008]Cards Burnside引理
[BZOJ1004][HNOI2008]Cards 题意:把$n$张牌染成$a,b,c$,3种颜色.其中颜色为$a,b,c$的牌的数量分别为$sa,sb,sc$.并且给出$m$个置换,保证这$m$个置 ...
- [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 置换群+背包
[bzoj1004][HNOI2008]Cards 2014年5月26日5,3502 Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿 ...
- 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】【HNOI20008】cards
看黄学长的代码才写出来的,sro_hzwer_orz 原题: 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给 ...
随机推荐
- 从两个集合里排除重复的写法(适用:DB表和字段都很多,表间有关联的情况)
获取其中一张表bulletinred为1的内容: public IList<BRShow> GetBulInfo() { var result = from a in ((Entities ...
- html-----015---HTML ASCII 参考手册
HTML 和 XHTML 用标准的 7 比特 ASCII 代码在网络上传输数据. 7 比特 ASCII 代码可提供 128 个不同的字符值. 7 比特 可显示的 ASCII 代码 <html&g ...
- 类库探源——System.Drawing.Bitmap
一.System.Drawing.Bitmap Bitmap 类: 封装GDI+ 位图,此位图由图形图像及其属性的像素数据组成.Bitmap 是用于处理由像素定义的图像的对象 命名空间: System ...
- Service Reference
1 Add Web Reference 根据wsdl文件,按照老的asp.net webservice客户访问机制,生成webservice代理类的方法,即从System.Web.Service ...
- mini2440移植uboot-2008.10 (一)
今天是我申请此博客的第一天,从现在开始养成每次学完新东西,都要写博客进行总结的习惯!!!Come on! 首先就从这两天学的uboot开始吧,这两天学这个东西郁闷死了,不知道该怎么去学,尤其是到nan ...
- 快速使用Log4Cpp
封了一下接口,快速使用. 其他的你都不用管了. 这里封装了需要读取外部conf文件配置输出项.否则可以用getInstance初始化日志类 #include "L4Cpp.h" v ...
- 类集对enum的支持。
1,EmumMap public class EnumMap<K extends Enum<K>,V>extends AbstractMap<K,V>impleme ...
- 双积分式(A/D)转换器电路结构及工作原理
1.转换方式 V-T型间接转换ADC. 2. 电路结构 图1是这种转换器的原理电路,它由积分器(由集成运放A组成).过零比较器(C).时钟脉冲控制门(G)和计数器(ff0-ffn)等几部分组成 图1 ...
- 从小白进阶ubuntu高手的必经之路—命令
精选的十二个ubuntu下的命令,熟记于心,则能甩掉ubuntu小白标签,高手的伟岸形象焕然生发.一.管理员权限绝大部分情况下,命令的行为须要被赋予管理员权限才能执行.命令 sudo 作用:赋予当前命 ...
- 根据WSDL生成代理类方式(2)
运行开发人员工具提示 输入命令行svcutil http://localhost:8080/Test/TestClassPort?wsdl