博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HNOI2008]Cards
阅读量:5893 次
发布时间:2019-06-19

本文共 2362 字,大约阅读时间需要 7 分钟。

Description

Solution

组合数学向来不好(其实啥也不好)的我,面对这个题,直接一脸懵B,在洗牌那里卡了好久,看了题解才知道,洗牌原来就是置换!这是Burnside引理的直接应用,亏我还学过Burnside,真是练习量太少,知识无法灵活运用,唉~,滚去刷题吧。

这道题用Burnside引理时有一个要注意的是数方案数的时候不要超过颜色限制,加一个递推即可。别忘了不变也是一个置换。

#include 
#include
const int N = 100;int mod, n, m;int ch[N][N], sr, sb, sg;int f[N][N][N];int b[N], vis[N];int pow_mod(int x, int b, int mod) { int ans = 1; for (; b; b >>= 1) { if (b & 1) ans = ans * x % mod; x = x * x % mod; } return ans % mod;}int main () { scanf("%d%d%d%d%d", &sr, &sb, &sg, &m, &mod); n = sr + sb + sg; int ans = 0; for (int i = 1; i <= m; ++i) { for (int j = 1; j <= n; ++j) { scanf("%d", &ch[i][j]); } int now = 1, cnt = 0; memset(vis, 0, sizeof vis); memset(b, 0, sizeof b); memset(f, 0, sizeof f); for (int j = 1; j <= n; ++j) if (!vis[j]) { now = j; vis[j] = 1; b[++cnt] = 1; while (!vis[ch[i][now]]) { vis[ch[i][now]] = 1; now = ch[i][now]; b[cnt]++; } } f[0][0][0] = 1; for (int k = 1, s = 0; k <= cnt; ++k) { s += b[k]; for (int j = 0; j <= sr; ++j) { for (int l = 0; l <= sg; ++l) { int p = s - j - l; if (p > sb || p < 0) continue; if (j >= b[k]) f[k][j][l] += f[k-1][j-b[k]][l]; if (l >= b[k]) f[k][j][l] += f[k-1][j][l-b[k]]; if (p >= b[k]) f[k][j][l] += f[k-1][j][l]; f[k][j][l] %= mod; } } } ans = (ans + f[cnt][sr][sg]) % mod; } memset(f, 0, sizeof f); f[0][0][0] = 1; for (int k = 1; k <= n; ++k) { for (int j = 0; j <= sr; ++j) { for (int l = 0; l <= sg; ++l) { int p = k - j - l; if (p > sb || p < 0) continue; if (j >= 1) f[k][j][l] += f[k-1][j-1][l]; if (l >= 1) f[k][j][l] += f[k-1][j][l-1]; if (p >= 1) f[k][j][l] += f[k-1][j][l]; f[k][j][l] %= mod; // mark } } } ans = (ans + f[n][sr][sg]) % mod * pow_mod(m+1, mod-2, mod) % mod; printf("%d\n", ans); return 0;}

Note

mark那里我一开始竟然忘写了。。。

转载于:https://www.cnblogs.com/wyxwyx/p/bzoj1004.html

你可能感兴趣的文章
MySQL utf8mb4 字符集:支持 emoji 表情符号
查看>>
IOS开发-如何debug及处理闪退,My App Crashed,Now What? - P...
查看>>
马云_拥抱敏捷-----华为的SDN实践
查看>>
Cocos2d-x 3移动游戏编程
查看>>
Android开发——09Google I/O之让Android UI性能更高效(1)
查看>>
广度优先搜索知识总结
查看>>
Java多线程机制详解(转)
查看>>
在 SELECT 查询中使用表表达式
查看>>
我的友情链接
查看>>
(二) php if语句,switch语句,continue语句,return语句,for 、while、do while 循环
查看>>
Hadoop集群(第7期)_Eclipse开发环境设置
查看>>
ARC 下两种释放对象的方法
查看>>
scala中的continue和break
查看>>
edx 获取当前request
查看>>
算法导论-分治、最大子序列问题
查看>>
安卓中如何实现滑动导航
查看>>
Java-金额小数转换成中文大写金额
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
squid.3.2故障整理
查看>>