BZOJ 1004 HNOI2008 Cards Burnside引理
标题效果:特定n张卡m换人,编号寻求等价类
数据保证这m换人加上置换群置换后本身构成
BZOJ坑爹0.0 条件不那么重要出来尼玛怎么做
Burnside引理……昨晚为了做这题硬啃了一晚上白书0.0 都快啃吐了0.0
Burnside引理:一个置换群下的等价类个数等于全部置换的不动点个数的平均值
没有接触过群论的建议去啃白书…… 网上的东西看不懂的
最后那个除法要用乘法逆元 我懒得写EXGCD写了费马小定理0.0
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 70
using namespace std;
int r,g,b,m,n,p,ans;
int a[M],stack[M],top;
int f[21][21][21];
void DFS(int x)
{
stack[top]++;
int temp=a[x];
a[x]=0;
if(a[temp])
DFS(temp);
}
int DP()
{
int i,j,k;
memset(f,0,sizeof f);f[0][0][0]=1;
while(top)
{
for(i=r;~i;i--)
for(j=g;~j;j--)
for(k=b;~k;k--)
{
if(i>=stack[top]) f[i][j][k]+=f[i-stack[top]][j][k];
if(j>=stack[top]) f[i][j][k]+=f[i][j-stack[top]][k];
if(k>=stack[top]) f[i][j][k]+=f[i][j][k-stack[top]];
f[i][j][k]%=p;
}
stack[top--]=0;
}
return f[r][g][b];
}
int KSM(int x,int y)
{
int re=1;
while(y)
{
if(y&1)re*=x,re%=p;
x*=x,x%=p;
y>>=1;
}
return re;
}
int main()
{
int i,j;
cin>>r>>g>>b>>m>>p;
n=r+g+b;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
scanf("%d",&a[j]);
for(j=1;j<=n;j++)
if(a[j])
++top,DFS(j);
ans+=DP(),ans%=p;
}
for(j=1;j<=n;j++)
a[j]=j;
for(j=1;j<=n;j++)
if(a[j])
++top,DFS(j);
ans+=DP(),ans%=p;
ans*=KSM(m+1,p-2),ans%=p;
cout<<ans<<endl;
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
BZOJ 1004 HNOI2008 Cards Burnside引理的更多相关文章
- BZOJ 1004: [HNOI2008]Cards( 置换群 + burnside引理 + 背包dp + 乘法逆元 )
题意保证了是一个置换群. 根据burnside引理, 答案为Σc(f) / (M+1). c(f)表示置换f的不动点数, 而题目限制了颜色的数量, 所以还得满足题目, 用背包dp来计算.dp(x,i, ...
- bzoj 1004 1004: [HNOI2008]Cards burnside定理
1004: [HNOI2008]Cards Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1668 Solved: 978[Submit][Stat ...
- bzoj1004 [HNOI2008]Cards Burnside 引理+背包
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1004 题解 直接 Burnside 引理就可以了. 要计算不动点的个数,那么对于一个长度为 \ ...
- [BZOJ 1004] [HNOI2008] Cards 【Burnside引理 + DP】
题目链接:BZOJ - 1004 题目分析 首先,几个定义和定理引理: 群:G是一个集合,*是定义在这个集合上的一个运算. 如果满足以下性质,那么(G, *)是一个群. 1)封闭性,对于任意 a, b ...
- 【BZOJ1004】[HNOI2008]Cards Burnside引理
[BZOJ1004][HNOI2008]Cards 题意:把$n$张牌染成$a,b,c$,3种颜色.其中颜色为$a,b,c$的牌的数量分别为$sa,sb,sc$.并且给出$m$个置换,保证这$m$个置 ...
- bzoj 1004 [HNOI2008]Cards && poj 2409 Let it Bead ——置换群
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1004 http://poj.org/problem?id=2409 学习材料:https:/ ...
- luogu P1446 [HNOI2008]Cards burnside引理 置换 不动点
LINK:Cards 不太会burnside引理 而这道题则是一个应用. 首先 一个非常舒服的地方是这道题给出了m个本质不同的置换 然后带上单位置换就是m+1个置换. burnside引理: 其中D( ...
- 【bzoj1004】[HNOI2008]Cards Burnside引理+背包dp
题目描述 用三种颜色染一个长度为 $n=Sr+Sb+Sg$ 序列,要求三种颜色分别有 $Sr,Sb,Sg$ 个.给出 $m$ 个置换,保证这 $m$ 个置换和置换 ${1,2,3,...,n\choo ...
- bzoj1004: [HNOI2008]Cards(burnside引理+DP)
题目大意:3种颜色,每种染si个,有m个置换,求所有本质不同的染色方案数. 置换群的burnside引理,还有个Pólya过几天再看看... burnside引理:有m个置换k种颜色,所有本质不同的染 ...
随机推荐
- java.lang.ClassFormatError
Error occurred during initialization of VMjava.lang.ClassFormatError: Unknown constant tag 26 in cla ...
- UI —— 计算器
#import <UIKit/UIKit.h> @interface MyViewController :UIViewController { NSInteger _firstName; ...
- NGUI判断是否点击到UI控件
注意:UI应加上Box Collider 1.射线检测 UICamera发一条射线,射线碰到了东西就说明点击到了UI Ray ray=UICamera.mainCamera.ScreenPointTo ...
- java提高篇(八)-----实现多重继承
多重继承指的是一个类可以同时从多于一个的父类那里继承行为和特征,然而我们知道Java为了保证数据安全,它只允许单继承.有些时候我们会认为如果系统中需要使用多重继承往往都是糟糕的设计,这个时候我们往往需 ...
- DDDLite的权限管理
领域驱动设计实战—基于DDDLite的权限管理 在园子里面,搜索一下“权限管理”至少能得到上千条的有效记录.记得刚开始工作的时候,写个通用的权限系统一直是自己的一个梦想.中间因为工作忙(其实就是懒 ...
- Linux开机自启动
永久打开或则关闭 chkconfig iptables on chkconfig iptables off 即时生效,重启后还原 service iptables start service ipta ...
- WP8.1开发者预览版本号已知 Bug
偶的 Lumia 920 已经升级到最新的 8.1 开发者预览版本号,使用中没有发现什么问题. 可能是由于偶玩手机的情况比較少吧!忽然看到 MS 停止此版本号的更新,并说明有非常多的 BUG,偶就郁闷 ...
- 【IPC第二个进程间通信】管道Pipe
IPC进程间通信+管道Pipe IPC(Inter-Process Communication,进程间通信). 管道用于进程间共享数据,事实上质是共享内存 ...
- jQuery整理笔记9----函数形式发展
在一些照片中使用演示样本.插入.样式文件下载:点我进入下载 过去在开发过程中关于table方面的jquery应用不过局限于使用jquery操作table添加一行.删除一列等等操作.今天整理的跟过去用的 ...
- MysqL的root用户不允许远程连接
原文:MysqL的root用户不允许远程连接 今天程序报了异常:java.sql.SQLException: Access denied for user 'root'@'RJB-Z' (using ...