枚举每个置换,求在每个置换下着色不变的方法数,先求出每个循环的大小,再动态规划求得使用给定的颜色时对应的方法数。

dp[i][j][k]表示处理到当前圈时R,B,G使用量为i,j,k时的方法数,背包思想。

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
#include<utility>
using namespace std;
typedef long long LL;
const int N = 68, INF = 0x3F3F3F3F;
#define MS(a, num) memset(a, num, sizeof(a))
#define PB(A) push_back(A)
#define FOR(i, n) for(int i = 0; i < n; i++)
int r, g, b, m, p, n;
int dis[N][N];
bool vis[N];
LL dp[N][N][N]; LL Ext_gcd(LL a,LL b,LL &x,LL &y){//扩展欧几里得
if(b==0) { x=1, y=0; return a; }
LL ret= Ext_gcd(b,a%b,y,x);
y-= a/b*x;
return ret;
}
LL Inv(LL a,int m){ ///求逆元
LL d,x,y,t= (LL)m;
d= Ext_gcd(a,t,x,y);
if(d==1) return (x%t+t)%t;
return -1;
} LL solve(){
LL ans = 0;
for(int x = 0; x < m; x++){
memset(vis, 0, sizeof(vis));
vector<int> v;
for(int i = 1; i <= n; i++){
if(!vis[i]){
int cnt = 0;
int tp = i;
while(!vis[tp]){
cnt++;
vis[tp] = 1;
tp = dis[x][tp];
}
v.push_back(cnt);
}
}
memset(dp, 0, sizeof(dp));
dp[0][0][0] = 1;
for(int t = 0; t < v.size(); t++){
for(int i = r; i >= 0; i--){
for(int j = b; j >= 0; j--){
for(int k = g; k >= 0; k--){
if(i == 0 && j == 0 && k == 0){
continue;
}
dp[i][j][k] = 0;
if(i >= v[t]){
dp[i][j][k] = (dp[i][j][k] + dp[i - v[t]][j][k]) % p;
}
if(j >= v[t]){
dp[i][j][k] = (dp[i][j][k] + dp[i][j - v[t]][k]) % p;
}
if(k >= v[t]){
dp[i][j][k] = (dp[i][j][k] + dp[i][j][k - v[t]]) % p;
}
}
}
}
}
ans = (ans + dp[r][b][g]) % p;
}
ans = ans * Inv(m, p) % p;
return ans;
}
int main(){
while(~scanf("%d %d %d %d %d", &r, &b, &g, &m, &p)){
n = r + b + g;
bool f = 1;
for(int i = 0; i < m; i++){
int cnt = 0;
for(int j = 1; j <= n; j++){
scanf("%d", &dis[i][j]);
if(dis[i][j] == j){
cnt++;
}
}
if(cnt == n){
f = 0;
}
}
if(f){
for(int i = 1; i <= n; i++){
dis[m][i] = i;
}
m++;
}
printf("%lld\n", solve());
}
return 0;
}

  

BZOJ1004 [HNOI2008]Cards(Polya计数)的更多相关文章

  1. [BZOJ1004] [HNOI2008] Cards (Polya定理)

    Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红 ...

  2. BZOJ1004[HNOI2008]Cards——polya定理+背包

    题目描述 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红色,Sb张蓝色 ...

  3. bzoj1004 [HNOI2008]Cards 置换群+背包

    [bzoj1004][HNOI2008]Cards 2014年5月26日5,3502 Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿 ...

  4. bzoj1004 [HNOI2008]Cards【Burnside/Polya】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1004 一道好题,但并不是好在融合了三个“考点”(计数,背包dp,逆元),其实背包dp以及求逆 ...

  5. [BZOJ1004] [HNOI2008]Cards解题报告(Burnside引理)

    Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红 ...

  6. BZOJ1004 [HNOI2008]Cards 【burnside定理 + 01背包】

    题目链接 BZOJ1004 题解 burnside定理 在\(m\)个置换下本质不同的染色方案数,等于每种置换下不变的方案数的平均数 记\(L\)为本质不同的染色方案数,\(m\)为置换数,\(f(i ...

  7. BZOJ1004 HNOI2008 Cards Burnside、背包

    传送门 在没做这道题之前天真的我以为\(Polya\)可以完全替代\(Burnside\) 考虑\(Burnside\)引理,它要求的是对于置换群中的每一种置换的不动点的数量. 既然是不动点,那么对于 ...

  8. bzoj1004: [HNOI2008]Cards(burnside引理+DP)

    题目大意:3种颜色,每种染si个,有m个置换,求所有本质不同的染色方案数. 置换群的burnside引理,还有个Pólya过几天再看看... burnside引理:有m个置换k种颜色,所有本质不同的染 ...

  9. [BZOJ1004][HNOI2008]Cards 群论+置换群+DP

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1004 首先贴几个群论相关定义和引理. 群:G是一个集合,*是定义在这个集合上的一个运算. ...

随机推荐

  1. Intellij IDEA使用总结

    查询快捷键CTRL+N   查找类CTRL+SHIFT+N  查找文件CTRL+SHIFT+ALT+N 查 找类中的方法或变量CIRL+B   找变量的来源CTRL+ALT+B  找所有的子类CTRL ...

  2. c++写入txt文件

    简单方式: #include "stdafx.h" #include <iostream> #include <iomanip> #include < ...

  3. xargs命令

    xargs命令 常用工具命令 xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具.它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者stdin并将其转换成特定命令 ...

  4. window下安装mongodb及php mongo扩展

    1.安装mongoDB 下载最新版本的 MongoDB 下载地址:http://www.mongodb.org/downloads 解压文件到 D:\mongodb 解压后的文件列表如下: 创建数据存 ...

  5. js弹出提示信息,然后跳转到另一页面

    <script language="javascript">  alert("您的用户名与密码已成功修改!");  document.locatio ...

  6. POJ 2769

    http://poj.org/problem?id=2796 题意:求n个数的和乘以这n个数中的最小值的积最大的数,以及其范围. 思路:求每一个数两边的比其大的数的和,再乘以这个数.还有一个范围,用单 ...

  7. 常见计算机基础笔试题总结quickstart

    [本文链接] 1. 以下是一颗平衡二叉树,请画出插入键值3以后的这颗平衡二叉树. 分析:考察平衡二叉树的基本操作,插入3变成不平衡,需要节点5右旋一次,节点2左旋一次.. 2. 表达式X=A+(B*( ...

  8. ABAP 弹窗案例

    DATA:  WL_ANSWER  TYPE C. CALL FUNCTION 'POPUP_TO_CONFIRM'    EXPORTING     TEXT_QUESTION            ...

  9. NHibernate实战详解(一)领域模型设计

    关于NHibernate的资料本身就不多,中文的就更少了,好在有一些翻译文章含金量很高,另外NHibernate与Hibernate的使用方式可谓神似,所以也有不少经验可以去参考Hibernate. ...

  10. codeforces 567D.One-Dimensional Battle Ships 解题报告

    题目链接:http://codeforces.com/problemset/problem/567/D 题目意思:给出 1 * n 的 field,编号从左至右依次为 1,2,...,n.问射 m 枪 ...