[BZOJ1004] [HNOI2008]Cards解题报告(Burnside引理)
Description
小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红色,Sb张蓝色,Sg张绝色.他又询问有多少种方案,Sun想了一下,又给出了正确答案. 最后小春发明了M种不同的洗牌法,这里他又问Sun有多少种不同的染色方案.两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用多种洗牌法,而每种方法可以使用多次)洗成另一种.Sun发现这个问题有点难度,决定交给你,答案可能很大,只要求出答案除以P的余数(P为质数).
这道题做了挺久的...感觉还是对于Burnside引理理解的不够透彻吧。
Burnside引理:
L=1/|G|*(c1+c2+...ck),ci表示第i种置换的不动置换类。如置换:(123)(45)(6)中的不动置换类只有(6)一个。
这道题不能用Polya定理,因为每种颜色有具体的数量要求,不能任意染色。
题目中给的洗牌方法,很显然就是一个个置换了。那么不动置换类要怎么求呢?
颜色相同的看上去也一样,所以如果置换后位置上的颜色与原位置的颜色相同,也算是不动置换类。
而这道题需要思考的是,我们应该怎样把染色方案带到公式里去。
答案是,将一个染色方案看做一个元素。
即这道题中的不动置换类为经过该种置换后仍然不变的一个染色方案。
那么不动置换类的个数即ci也就是满足在经过i种置换后每一位上颜色都不变的染色方案总数。
则每个循环中要染同一种颜色,可以用01背包来计算方案数。
最后不能忘记最重要也是最基础的一个置换即(1)(2)(3)...(n)这个置换。
实现的过程中需要用到求乘法逆元。稍加注意即可。
program bzoj1004;
const maxn=;
var i,j,t1,t2,t3:longint;
s1,s2,s3,m,p,n,ans,tot,sum,x:int64;
f:array[-..maxn,-..maxn,-..maxn]of int64;
vis:array[-..maxn]of boolean;
a:array[-..maxn]of longint; function ex_Euclid(a,b:int64;var x,y:int64):int64;
var t:int64;
begin
if b= then
begin
x:=;y:=;exit(a);
end else
begin
ex_Euclid:=ex_Euclid(b,a mod b,x,y);
t:=x;x:=y;y:=t-(a div b)*y;
end;
end; function inverse(a:int64):int64;
var x,y,tem,d:int64;
begin
d:=ex_Euclid(a,p,x,y);
if d<> then exit(-) else
begin
if x< then
begin
tem:=(-x) div p;
x:=x+tem*p;y:=y-tem*a;
end;
if x< then
begin
x:=x+p;y:=y-p;
end;
end;
exit(x);
end; begin
readln(s1,s2,s3,m,p);n:=s1+s2+s3;
ans:=;
for i:= to n do ans:=(ans*i) mod p;
for i:= to s1 do ans:=(ans*inverse(i)) mod p;
for i:= to s2 do ans:=(ans*inverse(i)) mod p;
for i:= to s3 do ans:=(ans*inverse(i)) mod p;
for i:= to m do
begin
fillchar(f,sizeof(f),);
fillchar(vis,sizeof(vis),true);
f[,,]:=;sum:=;
for j:= to n do read(a[j]);readln;
for j:= to n do if vis[j] then
begin
tot:=;
x:=a[j];vis[j]:=false;
while x<>j do
begin
inc(tot);
vis[x]:=false;
x:=a[x];
end;
inc(sum,tot);
for t1:= to sum do
for t2:= to sum-t1 do
begin
t3:=sum-t1-t2;
if t1-tot>= then f[t1,t2,t3]:=(f[t1,t2,t3]+f[t1-tot,t2,t3]) mod p;
if t2-tot>= then f[t1,t2,t3]:=(f[t1,t2,t3]+f[t1,t2-tot,t3]) mod p;
if t3-tot>= then f[t1,t2,t3]:=(f[t1,t2,t3]+f[t1,t2,t3-tot]) mod p;
end;
end;
end;
ans:=(ans*inverse(m+)) mod p;
writeln(ans);
end.
[BZOJ1004] [HNOI2008]Cards解题报告(Burnside引理)的更多相关文章
- 洛谷 P1446 [HNOI2008]Cards 解题报告
P1446 [HNOI2008]Cards 题目描述 小春现在很清闲,面对书桌上的\(N\)张牌,他决定给每张染色,目前小春只有\(3\)种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun ...
- 【BZOJ1004】【HNOI2008】Cards 群论 置换 burnside引理 背包DP
题目描述 有\(n\)张卡牌,要求你给这些卡牌染上RGB三种颜色,\(r\)张红色,\(g\)张绿色,\(b\)张蓝色. 还有\(m\)种洗牌方法,每种洗牌方法是一种置换.保证任意多次洗牌都可用这\( ...
- bzoj1004: [HNOI2008]Cards(burnside引理+DP)
题目大意:3种颜色,每种染si个,有m个置换,求所有本质不同的染色方案数. 置换群的burnside引理,还有个Pólya过几天再看看... burnside引理:有m个置换k种颜色,所有本质不同的染 ...
- BZOJ1004: [HNOI2008]Cards(Burnside引理 背包dp)
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4255 Solved: 2582[Submit][Status][Discuss] Descript ...
- [bzoj1004][HNOI2008][Cards] (置换群+Burnside引理+动态规划)
Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红 ...
- bzoj1004 [HNOI2008]Cards Burnside 引理+背包
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1004 题解 直接 Burnside 引理就可以了. 要计算不动点的个数,那么对于一个长度为 \ ...
- BZOJ1004 HNOI2008 Cards Burnside、背包
传送门 在没做这道题之前天真的我以为\(Polya\)可以完全替代\(Burnside\) 考虑\(Burnside\)引理,它要求的是对于置换群中的每一种置换的不动点的数量. 既然是不动点,那么对于 ...
- bzoj1004 [HNOI2008]Cards Burnside定理+背包
题目传送门 思路:首先是Burnside引理,要先学会这个博客. Burnside引理我们总结一下,就是 每种置换下不动点的数量之和除以置换的总数,得到染色方案的数量. 这道题,显然每种 ...
- bzoj1004 [HNOI2008]Cards 置换群+背包
[bzoj1004][HNOI2008]Cards 2014年5月26日5,3502 Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿 ...
随机推荐
- anaconda虚拟环境操作
1.首先在所在系统中安装Anaconda.可以打开命令行输入conda -V检验是否安装以及当前conda的版本. 2.conda常用的命令. 1)conda list 查看安装了哪些包. 2)con ...
- Spring MVC - URL路径映射
1. 普通映射 A. @RequestMapping("/test1") B. @RequestMapping(value={"/test1", "/ ...
- 涉及到大小变化,类似QScrollArea判断大小是否显示滚动条
涉及到大小变化,类似QScrollArea判断大小是否显示滚动条的情况要注意 这两个属性的设置:
- android get cpu rate
public static int getProcessCpuRate() { try { RandomAccessFile reader = new RandomAccessFile("/ ...
- Spring实战第五章学习笔记————构建Spring Web应用程序
Spring实战第五章学习笔记----构建Spring Web应用程序 Spring MVC基于模型-视图-控制器(Model-View-Controller)模式实现,它能够构建像Spring框架那 ...
- HDFS常用文件操作
put 上传文件 hadoop fs -put wordcount.txt /data/wordcount/ text 查看文件内容 hadoop fs -text /output/wo ...
- 九度OJ--Q1473
import java.util.ArrayList;import java.util.Scanner; /* * 题目描述: * 大家都知道,数据在计算机里中存储是以二进制的形式存储的. * 有一天 ...
- HDU 1271 整数对(思路题)
假设删除第k位,把整数A表示成如下形式: A = a * 10^(k+1) + b * 10 ^k + c; 则: B = a * 10^k + c; N = A + B = (11*a+b)*10^ ...
- EasyUI 显示表单数据 小记
界面图:
- lintcode-137-克隆图
137-克隆图 克隆一张无向图,图中的每个节点包含一个 label 和一个列表 neighbors. 数据中如何表示一个无向图?http://www.lintcode.com/help/graph/ ...