[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种颜色:红色,蓝色,绿 ...
随机推荐
- 26、js阶段性复习
1.一元运算符 Operator + 可用于将变量转换为数字: <!DOCTYPE html> <html> <body> <p> typeof 操作符 ...
- Python 3基础教程27-字典
这篇来介绍Python中的字典.字典一般用大括号包裹起来,里面的元素都是有键和值组成. # 字典 # 我们随便设计几个城市的明天的最高温度tem ={'北京':22,'上海':23,'深圳':24,' ...
- 怎样安装PyCharm
在地址栏输入http://www.jetbrains.com/pycharm/ 打开PyCharm官网 http://idea.lanyus.com/
- Leetcode代码补全——二叉树
在刷leetcode的过程中发现,在原网页输入答案是不需要自己构筑树和链表的,虽然便于直接思考算法,但是久而久之类似过于依赖编辑器,反而不知道如何创建树和链表,因此总结了该网页省略的部分,以其中题为例 ...
- 总结java操作MySQL 即JDBC的使用
java.sql包中存在DriverManager类,Connection接口,Statement接口和ResultSet接口.类和接口作用如下: DriverManager:主要用于管理驱动程序和连 ...
- lintcode-101-删除排序数组中的重复数字 II
101-删除排序数组中的重复数字 II 跟进"删除重复数字": 如果可以允许出现两次重复将如何处理? 样例 标签 数组 两根指针 脸书 思路 参照上一篇博客lintcode-100 ...
- 201621044079WEEK06-接口、内部类
作业06-接口.内部类 1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多 ...
- elasticsearch 工具类
<?php /** * Created by PhpStorm. * User: brady * Date: 2018/4/8 * Time: 10:31 * esticsearch helpe ...
- SQL Server 性能调优 之执行计划(Execution Plan)调优
SQL Server 存在三种 Join 策略:Hash Join,Merge Join,Nested Loop Join. Hash Join:用来处理没有排过序/没有索引的数据,它在内存中把 Jo ...
- Java进阶
Java进阶(一)Annotation(注解) Java进阶(二)当我们说线程安全时,到底在说什么 Java进阶(三)多线程开发关键技术 Java进阶(四)线程间通信方式对比 Java进阶(五)NIO ...