bzoj1004题解
【题意分析】
给N个元素染色,可以在定置换群的作用下互相转化的染色方案算相同的,问本质不同的染色方案数。
【解题思路】
引理:Burnside定理
设集合S=[1,n]∩N,记等价类数为L,给定S上的置换群G。
Zk (k不动置换类):若k是S中某个元素,G中使k保持不变的置换的全体,记以Zk,叫做G中使k保持不动的置换类,简称k不动置换类。
C(π)(置换n的不动点全集):对于一个置换π∈G,及a∈X,若π(a)=a,则称a为π的不动点。π的不动点的全体记为C(π)。
有定理:L=1/|G|*∑|Zk|(k∈S)=1/|G|*Σ|C(n)|(n∈G)。
所以,我们只要分别计算G中每个置换的不动点数,就可以计算出等价类数。外层复杂度O(m)。
考虑染色,对于每个置换,在同一个置换环中的元素必定染成同色,才能保证集合range(n)经过置换后染色方案不变,所以可以用三维背包来计算方案数。内层复杂度O(SrSgSb+n)。
总复杂度O(n^2+nSrSgSb)。
【参考代码】
#include <cmath>
#include <cstdio>
#define REP(I,start,end) for(int I=(start);I<=(end);I++)
#define PER(I,start,end) for(int I=(start);I>=(end);I--)
#define REPs(I,start,end,step) for(int I=(start);I<=(end);I+=(step))
#define PERs(I,start,end,step) for(int I=(start);I>=(end);I-=(step))
using namespace std;
typedef unsigned short US;
typedef unsigned long UL;
typedef long long LL;
typedef unsigned long long ULL;
inline int getint()
{
char ch=getchar();
while((ch<''||ch>'')&&ch!='-')
ch=getchar();
int result=0;
bool impositive=ch=='-';
if(impositive)
ch=getchar();
while(ch>=''&&ch<='')
{
result=(result<<3)+(result<<1)+ch-'';
ch=getchar();
}
return impositive?-result:result;
}
inline int putint(int n)
{
int result=1;
char* sav=new char[20];
bool impositive=n<0;
if(impositive)
{
putchar('-');
n=-n;
}
sav[0]=n%10+'';
while(n/=10)
sav[result++]=n%10+'';
PER(i,result-1,0)
putchar(sav[i]);
delete []sav;
return result+impositive;
}
inline LL getLL()
{
char ch=getchar();
while((ch<''||ch>'')&&ch!='-')
ch=getchar();
LL result=0ll;
bool impositive=ch=='-';
if(impositive)
ch=getchar();
while(ch>=''&&ch<='')
{
result=(result<<3)+(result<<1)+ch-'';
ch=getchar();
}
return impositive?-result:result;
}
inline int putLL(LL n)
{
int result=1;
char* sav=new char[20];
bool impositive=n<0;
if(impositive)
{
putchar('-');
n=-n;
}
sav[0]=n%10+'';
while(n/=10)
sav[result++]=n%10+'';
PER(i,result-1,0)
putchar(sav[i]);
delete []sav;
return result+impositive;
}
template<typename integer> inline int read_int(integer &n)
{
char ch=getchar();
while((ch<''||ch>'')&&ch!='-')
ch=getchar();
int result=n=integer(0);
bool impositive=ch=='-';
if(impositive)
ch=getchar();
while(ch>=''&&ch<='')
{
n=(n<<3)+(n<<1)+integer(ch-'');
result++;
ch=getchar();
}
if(impositive)
{
n=-n;
result++;
}
return result;
}
template<typename integer> inline int write_int(integer n)
{
int result=1;
char* sav=new char[20];
bool impositive=n<0;
if(impositive)
{
putchar('-');
n=-n;
}
sav[0]=n%10+'';
while(n/=10)
sav[result++]=n%10+'';
PER(i,result-1,0)
putchar(sav[i]);
delete []sav;
return result+impositive;
}
template<typename integer> inline integer sqr(integer n)
{
return n*n;
}
template<typename base_type,typename exp_type> inline base_type PowerMod(base_type Base,exp_type Exp,base_type Mod)
{
bool* sav=new bool[int(log(Exp)/log(2))+1];
int tot=0;
base_type result=base_type(1),baser=Base%Mod;
exp_type tmp=Exp;
while(tmp)
{
sav[tot++]=tmp&1;
tmp>>=1;
}
while(tot)
{
result=sqr(result)%Mod;
if(sav[--tot])
result=result*baser%Mod;
}
delete []sav;
return result;
}
//====================================Header Template===================================
#include <cstring>
bool used[100];
int sr,sb,sg,n,p,trans[100],cnt[100],f[30][30][30];
inline int mod_reverse(int _n,int _p)
{
return PowerMod(_n,_p-2,_p);
}
inline int DP()
{
memset(f,0,sizeof(f));
memset(used,0,sizeof(used));
int group=0;
REP(i,1,n)
if(!used[i])
{
used[i]=true;
int j=trans[i],tot=1;
while(!used[j])
{
used[j]=true;
tot++;
j=trans[j];
}
cnt[++group]=tot;
}
f[0][0][0]=1;
REP(g,1,group)
PER(i,sr,0)
PER(j,sb,0)
PER(k,sg,0)
{
if(i>=cnt[g])
(f[i][j][k]+=f[i-cnt[g]][j][k])%=p;
if(j>=cnt[g])
(f[i][j][k]+=f[i][j-cnt[g]][k])%=p;
if(k>=cnt[g])
(f[i][j][k]+=f[i][j][k-cnt[g]])%=p;
}
return f[sr][sb][sg];
}
int main()
{
sr=getint();
sb=getint();
sg=getint();
int m=getint();
p=getint();
n=sr+sb+sg;
int ans=0;
REP(i,1,m)
{
REP(j,1,n)
trans[j]=getint();
(ans+=DP())%=p;
}
REP(i,1,n)
trans[i]=i;
(ans+=DP())%=p;
putint(ans*mod_reverse(m+1,p)%p);
return 0;
}
bzoj1004题解的更多相关文章
- BZOJ1004 [HNOI2008]Cards 【burnside定理 + 01背包】
题目链接 BZOJ1004 题解 burnside定理 在\(m\)个置换下本质不同的染色方案数,等于每种置换下不变的方案数的平均数 记\(L\)为本质不同的染色方案数,\(m\)为置换数,\(f(i ...
- [题解]BZOJ1004 序列函数
原题找不到了,应该是usaco之类的题目吧.给一个可以交题的链接:http://www.cqoi.net:2012/problem.php?id=1004 思路:将素数一个一个往里乘,保证扫描的顺序是 ...
- 【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】[HNOI2008]Cards Burnside引理
[BZOJ1004][HNOI2008]Cards 题意:把$n$张牌染成$a,b,c$,3种颜色.其中颜色为$a,b,c$的牌的数量分别为$sa,sb,sc$.并且给出$m$个置换,保证这$m$个置 ...
- bzoj1004 [HNOI2008]Cards 置换群+背包
[bzoj1004][HNOI2008]Cards 2014年5月26日5,3502 Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
随机推荐
- eclipse启动Failed to load the JNI shared library
由于安装jdk安装了多个版本,用其他开发工具,某天再打开eclipse时弹出“Failed to load the JNI shared library jvm.dll” 原因:eclipse的版本与 ...
- Spring 整合 Redis(转)
转自http://blog.csdn.net/java2000_wl/article/details/8543203 pom构建: <modelVersion>4.0.0</mode ...
- Scala(一)基础
OOP 面向对象编程 AOP 面向切面编程 FP 函数式编程 编程语言都要定义变量,一些代码是用来注释的,变量和变量之间有一些关系,要做一些运算,运算离不开流程控制,进行运算的数据往往来自数据结构,最 ...
- webapp兼容问题解决
1. IOS移动端click事件300ms的延迟响应 移动设备上的web网页是有300ms延迟的,玩玩会造成按钮点击延迟甚至是点击失效.这是由于区分单击事件和双击屏幕缩放的历史原因造成的, 2007年 ...
- Magento用SQL语句开发篇
有时为了调试magento,需要获取当前的查询sql语句,在magento中获取SQL语句,这里我们通过$collection->getSelectSql(true)来调试sql 1 $coll ...
- 【Linux】windows下编写的脚本文件,放到Linux中无法识别格式
注意:我启动的时候遇到脚本错误 » sh startup.sh -m standalone tanghuang@bogon : command not found : command not foun ...
- VC 串口通讯基本原理,讲的很是详细
目 录打开串口............................................................................................. ...
- 贪心——cf708b
先求0,1的个数,然后贪心输出01即可 #include<bits/stdc++.h> using namespace std; #define ll long long ll a,b,c ...
- Luogu P2269 [HNOI2002]高质量的数据传输
这题给大家提供一下思路~ (为不想贴代码找借口) 声明:两个思路都是正确的,并且都AC了.(逃) 总体布局 求传输失败率\(1-\prod(1-p_{i})\)最小就是求 传输成功率\(\prod(1 ...
- html标签中的 MIME 类型
1.<script type="text/x-template"> MIME 类型 2.MIME类型是什么 : http://www.w3school.com.cn/ ...