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 ...
随机推荐
- rest framework之渲染器
一.内置渲染器 REST框架包括许多内置的Renderer类,它们允许你使用各种媒体类型返回响应.还支持定义你自己的自定义渲染器. 内置渲染器的使用 1.全局设置 可以使用DEFAULT_RENDER ...
- 将中国标准时间)转化为yyyy-MM-dd
有两种方法: 1. ]); ) + '-' + d.getDate() + ' ' + d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds ...
- MyBatis 通过包含的jdbcType类型
BIT FLOAT CHAR TIMESTAMP OTHER UNDEFINED TINYINT REAL V ...
- 统计所有小于非负整数 n 的质数的数量,埃拉托斯特尼筛法
素数的定义:质数又称素数.一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数. 1.暴力算法: 令i=2; 当i<n的时候,我们循环找出2-i的质数,即让i%(2~i-1), ...
- bypass_safedog
1.SQL注入 手工bypass要点 先通过破坏关键字测试出拦截规则 之后进行针对性绕过 1.Mysql 1.1.联合注入 0x01 and绕过 直接 and 1=1 直接就会被拦截 在数值的前面加特 ...
- classmethod和staticmethod
假设有这么一个 class class Date(object): def __init__(self, day=0, month=0, year=0): self.day = day self.mo ...
- layer.msg的使用
源码: layer.msg('只想弱弱提示'); layer.msg('表情提示', {icon: 6}); layer.msg('关闭后想做些什么呢', function(){ //自动执行这里面的 ...
- thinkphp wechat
该接口对应的文件为Com/Wechat.class.php, 主要用户接收微信推送过来的用户数据并自动回复. 注意:识别和分析用户发送的内容,并提供回复内容需要开发者更具实际情况自己实现,本接口值提供 ...
- js设计模式——2.外观模式
js设计模式——2.外观模式
- delphi基础篇之数据类型之一:1.简单类型(Simple)
1.简单类型(Simple) 简单类型包括实数类型(Real)和有序类型(Ordinal).有序类型又包括整数类型.字符类型.布尔类型.枚举类型和子界类型等. 1-1.有序类型 有序类型是一个有序数的 ...