BZOJ 1004 Cards(Burnside引理+DP)
因为有着色数的限制,故使用Burnside引理。
添加一个元置换(1,2,,,n)形成m+1种置换,对于每个置换求出循环节的个数,
每个循环节的长度。
则ans=sigma(f(i))/(m+1) %p (1<=i<=m+1).
其中f(i)是第i种置换下的不动点个数。
可以用dp来求出f(i), 设第i个置换的循环节个数为T, 令dp[i][j][k]表示前i个循环节中使用了j个红色,k个蓝色的不动点个数。进行一次n^3的DP即可。
最后m+1模p意义下的逆元不再叙述。
# include <cstdio>
# include <cstring>
# include <cstdlib>
# include <iostream>
# include <vector>
# include <queue>
# include <stack>
# include <map>
# include <set>
# include <cmath>
# include <algorithm>
using namespace std;
# define lowbit(x) ((x)&(-x))
# define pi acos(-1.0)
# define eps 1e-
# define MOD
# define INF (LL)<<
# define mem(a,b) memset(a,b,sizeof(a))
# define FOR(i,a,n) for(int i=a; i<=n; ++i)
# define FO(i,a,n) for(int i=a; i<n; ++i)
# define bug puts("H");
# define lch p<<,l,mid
# define rch p<<|,mid+,r
# define mp make_pair
# define pb push_back
typedef pair<int,int> PII;
typedef vector<int> VI;
# pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long LL;
int Scan() {
int res=, flag=;
char ch;
if((ch=getchar())=='-') flag=;
else if(ch>=''&&ch<='') res=ch-'';
while((ch=getchar())>=''&&ch<='') res=res*+(ch-'');
return flag?-res:res;
}
void Out(int a) {
if(a<) {putchar('-'); a=-a;}
if(a>=) Out(a/);
putchar(a%+'');
}
const int N=;
//Code begin... struct Per{int a[];}per[];
int dp[][][], n, vis[], num[]; int get_loop(int x)
{
int cnt=;
mem(vis,); mem(num,);
FOR(i,,n) {
if (vis[i]) continue;
++cnt;
int now=i;
while (vis[now]==) vis[now]=, now=per[x].a[now], ++num[cnt];
}
return cnt;
}
int extend_gcd(int a, int b, int &x, int &y)
{
if (a==&&b==) return -;
if (b==){x=; y=; return a;}
int d=extend_gcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int mod_reverse(int a, int n)
{
int x, y, d=extend_gcd(a,n,x,y);
if (d==) return (x%n+n)%n;
else return -;
}
int main ()
{
int sr, sb, sg, m, p;
LL ans=;
scanf("%d%d%d%d%d",&sr,&sb,&sg,&m,&p);
n=sr+sb+sg;
FOR(i,,m) FOR(j,,n) scanf("%d",&per[i].a[j]);
FOR(j,,n) per[m+].a[j]=j;
FOR(i,,m+) {
int t=get_loop(i);
mem(dp,);
dp[][][]=;
int sum=;
for (int j=; j<=t; ++j) FOR(k,,sr) FOR(l,,sb) {
sum+=num[j];
if (k+l>sum) continue;
if (sum-k-l>=num[j]) dp[j][k][l]=dp[j-][k][l];
if (k>=num[j]) dp[j][k][l]=(dp[j][k][l]+dp[j-][k-num[j]][l])%p;
if (l>=num[j]) dp[j][k][l]=(dp[j][k][l]+dp[j-][k][l-num[j]])%p;
}
ans=(ans+dp[t][sr][sb])%p;
}
ans=ans*mod_reverse(m+,p)%p;
printf("%lld\n",ans);
return ;
}
BZOJ 1004 Cards(Burnside引理+DP)的更多相关文章
- bzoj1004: [HNOI2008]Cards(burnside引理+DP)
题目大意:3种颜色,每种染si个,有m个置换,求所有本质不同的染色方案数. 置换群的burnside引理,还有个Pólya过几天再看看... burnside引理:有m个置换k种颜色,所有本质不同的染 ...
- [BZOJ 1004] [HNOI2008] Cards 【Burnside引理 + DP】
题目链接:BZOJ - 1004 题目分析 首先,几个定义和定理引理: 群:G是一个集合,*是定义在这个集合上的一个运算. 如果满足以下性质,那么(G, *)是一个群. 1)封闭性,对于任意 a, b ...
- BZOJ 1004 Cards(Burnside引理+DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1004 题意:三种颜色的扑克牌各有Sr,Sb,Sg张.给出m种置换.两种染色方案在某种置换 ...
- [bzoj 1004][HNOI 2008]Cards(Burnside引理+DP)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1004 分析: 1.确定方向:肯定是组合数学问题,不是Polya就是Burnside,然后题目上 ...
- BZOJ 1004 HNOI2008 Cards Burnside引理
标题效果:特定n张卡m换人,编号寻求等价类 数据保证这m换人加上置换群置换后本身构成 BZOJ坑爹0.0 条件不那么重要出来尼玛怎么做 Burnside引理--昨晚为了做这题硬啃了一晚上白书0.0 都 ...
- bzoj 1004 burnside 引理+DP
对于burnside引理需要枚举染色,这道题属于burnside的一种简单求解的方法,就是polya,我们可以使每一种置换中的循环节中的元素的颜色都相同,那么这样的话就可以直接DP了,我们可以将m个置 ...
- 【bzoj1004】[HNOI2008]Cards Burnside引理+背包dp
题目描述 用三种颜色染一个长度为 $n=Sr+Sb+Sg$ 序列,要求三种颜色分别有 $Sr,Sb,Sg$ 个.给出 $m$ 个置换,保证这 $m$ 个置换和置换 ${1,2,3,...,n\choo ...
- BZOJ1004: [HNOI2008]Cards(Burnside引理 背包dp)
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4255 Solved: 2582[Submit][Status][Discuss] Descript ...
- bzoj 1004 Cards & poj 2409 Let it Bead —— 置换群
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1004 关于置换群:https://www.cnblogs.com/nietzsche-oie ...
随机推荐
- AngularJS-Learning ui-router angular-transitions
https://github.com/mgechev/AngularJS-Learning https://github.com/angular-ui/ui-router https://github ...
- Git使用规范(三)
今天我们来介绍一下Git的一些操作,这个里面主要是一些我们平时遇到的一些问题 1.当我进入了一个分支的是时候,我在查看git log的时候,为什么会有别人的信息,我一直以为 这个是查看分支提交情况, ...
- 【LG3527】[POI2011]MET-Meteors
[LG3527][POI2011]MET-Meteors 题面 洛谷 题解 整体二分. 每次二分\(mid\),如果到时间\(mid\)以收集过\(P_i\)就存入子序列\(L\),否则存入子序列\( ...
- 《绝地求生大逃杀》BE错误怎么办 BE服务未正常运行及安装失败解决方法
<绝地求生大逃杀>BattlEye Launcher是游戏的反作弊程序,也是启动过程中做容易出现错误的,今天小编带来“爆锤吧务”分享的<绝地求生大逃杀>BE服务未正常运行及安装 ...
- 一个只有十行的精简MVVM框架
本文来自网易云社区. 前言 MVVM模式相信做前端的人都不陌生,去网上搜MVVM,会出现一大堆关于MVVM模式的博文,但是这些博文大多都只是用图片和文字来进行抽象的概念讲解,对于刚接触MVVM模式的新 ...
- redux devtools调试工具
项目安装: npm install redux-devtools-extension -dev 谷歌搜索 Redux DevTools 安装: 使用: 主要用到state&Dispatcher ...
- pyhon文件操作典型代码实现(非常经典!)
1. 编写一个程序,统计当前目录下每个文件类型的文件数,程序实现如图: 实现代码: import os all_files = os.listdir(os.chdir("D:\\" ...
- Java应用基础微专业-工程篇
第1章-命令行 1.1 命令行基础 ls -a: list all files (including hidden files) .DS_Store: files detailed informati ...
- mysql 各种存储引擎的特点
- 缓存 memcache 小白笔记
W: Memcached是神魔? Q:Memcached是一个自由开源的,高性能,分布式内存对象缓存系统. W:原理图 Q:如下 1浏览器 2 服务器 3 数据库 4 memcac ...