【题目链接】:http://www.lydsy.com/JudgeOnline/problem.php?id=1004

【题意】



给你sr+sb+sg张牌,(令n=sr+sb+sg),让你把这n张牌染成3种颜色(红蓝绿),且红色sr张,蓝色sb张,绿色sg张;

同时再给你m个变化关系change[i],这里从左往右数第change[i]张牌可以移动到第i个位置;

m行的变化关系每行都有n个change,即change[1..n]

然后任意两种染色的方案只有在用m个变化关系不能互相到达时才认为不同;(每个变化可以任意次数使用)

【题解】



看了别人的题解,都说是burnside定理;

这个定理的内容是说;

m个变化,k种颜色染色;

本质不同的染色方案数是

m种变化中特殊的染色方案的和的平均数

一种变化可能有多种特殊的染色方案;

这里第i种变化的特殊方案指的是:

在把每张纸染色之后,无论经过多少次第i行的这个变化,这n张纸的颜色还是维持一开始染色的那个样子;

我们知道每一行的变化里面肯定有多个循环节,既然要前后不变;那么就让同一个循环节里面的纸的颜色一样就好;

这样,我们可以一个变化一个变化的处理出m个变化的特殊的染色方案的和;

然后再除m就好;

这里对于求某一个变化的特殊染色方案数;

可以用dp来搞;(背包方案数);

假设这一行的变化有cnt个循环节;

则对于每个循环节来说都有3种可能,染成红色或者染成蓝色或者染成绿色;

这里背包的重量就是这个循环节的长度(即整个循环节都染成同一种颜色);

写成3维的,然后逆序更新就好(按照01背包的更新方式);

f[i][j][k]表示红色染了i个,蓝色染了j个,绿色染了k个的方案数;

最后返回f[sr][sb][sg]就好;

f[0][0][0]=1;

因为答案涉及到了除法取模;

所以还得写个乘法逆元;

这里可以不用写扩展欧几里得了;

又学了一个新的方法;

在gcd(a,p)==1的时候(即互质),且p为质数;

(a^(p-1))%p=1;

则有(a*(a^(p-2)))%p=1;

这里就能看出来了a^(p-2)就是a的乘法逆元;

这里因为m+1<=p且p为质数;

所以m不可能为p的倍数,则m和p肯定是互质的;

也就满足上述条件了;

写个快速幂呗;

直接暴力乘也ok的吧.

(感觉这个费马小定理版的乘法逆元好记多了..)



【完整代码】

/**************************************************************
Problem: 1004
User: chengchunyang
Language: C++
Result: Accepted
Time:2132 ms
Memory:11740 kb
****************************************************************/ #include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%I64d",&x) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 110; int sr,sb,sg,m,p,bh[N][N],n;
LL sumc = 0,f[N][N][N],siz[N],ny = 1;
bool bo[N]; LL js(int x)
{
int num = 0;
memset(bo,false,sizeof bo);
memset(siz,0,sizeof siz);
memset(f,0,sizeof f);
rep1(i,1,n)
{
if (bo[i]) continue;
num++;
int p = bh[x][i];
while (!bo[p]) bo[p] = true,siz[num]++,p = bh[x][p];
} f[0][0][0] = 1; rep1(i,1,num)
rep2(j,sb,0)
rep2(k,sr,0)
rep2(l,sg,0)
{
if (j>=siz[i]) f[j][k][l] = (f[j][k][l]+f[j-siz[i]][k][l])%p;
if (k>=siz[i]) f[j][k][l] = (f[j][k][l]+f[j][k-siz[i]][l])%p;
if (l>=siz[i]) f[j][k][l] = (f[j][k][l]+f[j][k][l-siz[i]])%p;
}
return f[sb][sr][sg];
} void ksm(int x)
{
if (!x) return;
ksm(x>>1);
ny = (ny*ny)%p;
if (x&1)
ny = (ny*m)%p;
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
rei(sr),rei(sb),rei(sg),rei(m),rei(p);
n = sr+sb+sg;
rep1(i,1,m)
rep1(j,1,n)
rei(bh[i][j]);
m++;
rep1(i,1,n)
bh[m][i] = i;
rep1(i,1,m)
sumc = (sumc+js(i))%p;
ksm(p-2);
sumc = (sumc*ny)%p;
cout << sumc << endl;
return 0;
}

【BZOJ 1004】 [HNOI2008]Cards的更多相关文章

  1. 【BZOJ 1004】 1004: [HNOI2008]Cards (置换、burnside引理)

    1004: [HNOI2008]Cards Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很 ...

  2. 【BZOJ 1005】[HNOI2008]明明的烦恼(暴力化简法)

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1005 [题意] 中文题 [题解] 一棵节点上标有序号的树会和一个prufer数列唯一对 ...

  3. 【BZOJ 1011】[HNOI2008]遥远的行星

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1011 [题意] [题解] 这里的答案误差不超过5%是突破点; 如果是直接暴力写; 复杂 ...

  4. 【BZOJ 1008】[HNOI2008]越狱

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1008 [题意] [题解] 相邻就会犯罪的话; 可以考虑它的反面; 即让所有相同信仰的人 ...

  5. 【BZOJ 1007】 [HNOI2008]水平可见直线

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1007 [题意] [题解] 这个人讲得很好 http://blog.csdn.net/o ...

  6. 【BZOJ 1005】[HNOI2008]明明的烦恼(化简的另一种方法)

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1005 [题意] [题解] 题目和题解在上一篇; 这里 对 [(m^(n-2-tot)) ...

  7. 【BZOJ 1004】【HNOI 2008】Cards

    http://www.lydsy.com/JudgeOnline/problem.php?id=1004 注意数据给出的m是一个没有单位元的置换群! 用Burnside引理,然后对每个置换群dp一下就 ...

  8. 【BZOJ 1010】 [HNOI2008]玩具装箱toy (斜率优化)

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9330  Solved: 3739 Descriptio ...

  9. 【BZOJ 1006】[HNOI2008]神奇的国度

    Description K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系 ...

随机推荐

  1. DOM事件机制

    前言 本文主要介绍DOM事件级别.DOM事件模型.事件流.事件代理和Event对象常见的应用,希望对你们有些帮助和启发! 本文首发地址为GitHub博客,写文章不易,请多多支持与关注! 一.DOM事件 ...

  2. 洛谷P1316 P1824

    P1316 丢瓶盖 题目描述 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以 ...

  3. 移动端以及 PC浏览器页面分享到朋友圈等的功能实现

    我们经常可以在一些 app上看到分享到朋友圈.微信好友.qq好友等功能,例如 饿了么.美团等 app,下单之后就会弹出给好友发红包的 modal窗,这在 app上很常见,app的权限可以很大,甚至连启 ...

  4. 自学FPAG笔记之 " top_down “

    top_town设计:在FPGA中top_down(自顶向上)是十分重要的一种编程方法,优点:使用top_down方法去写代码会使得程序看起来十分简洁,缺点:top_down写的文件会特别多. 例子: ...

  5. 【JZOJ3875】【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)

    fg 在遥远的S星系中一共有N个星球,编号为1-N.其中的一些星球决定组成联盟,以方便相互间的交流. 但是,组成联盟的首要条件就是交通条件.初始时,在这N个星球间有M条太空隧道.每条太空隧道连接两个星 ...

  6. 【JZOJ4770】【NOIP2016提高A组模拟9.9】闭门造车

    题目描述 自从htn体验了一把飙车的快感,他就下定决心要闭门造车!但是他两手空空怎么造得出车来呢?无奈的他只好来到了汽车零部件商店. 一走进商店,玲琅满目的各式零件看得htn眼花缭乱.但是他很快便反应 ...

  7. Spring_MVC

    SpringMVC处理流程 分析: M-Model 模型(完成业务逻辑:有javaBean构成,service+dao+entity) V-View 视图(做界面的展示  jsp,html……) C- ...

  8. poj3294 后缀数组

    后缀数组多个字符串问题. 先求出height[]数组,然后二分求最大的长度. 但是条件需要改变.如果出现次数大于一般那就满足.然后就要解决如何判断那一段属于其中一个字符串. 所以先处理出长度.并且不断 ...

  9. BZOJ1878 洛谷1972 HH的项链题解

    洛谷链接 BZOJ链接 看到这样不用修改的题目,应该佷容易就联想到了离线来处理. 我们发现若将询问按照r来排序,排完后每次对答案有贡献的仅是每个颜色最后出现的位置 我们用next[i]表示i处颜色之前 ...

  10. 域名拆分 tld

    概念 URL Universal Resource Locator ,统一资源定位符. 用处:用来标识互联网资源的唯一地址. 本质:提供了互联网上任一资源地址的通用表示方法. protocol://h ...