BZOJ 1004 [HNOI2008]Cards 置换+burnside定理+逆元
来源:互联网 发布:如何加淘宝店铺粉丝 编辑:程序博客网 时间:2024/06/05 02:16
题意:链接
方法:burnside定理
解析:
首先分析这道题,给你n个方格,染m种颜色,每种颜色有限制,之后又给了你包含m个置换的置换群,当然还有另一种自身不变的置换,即m+1个置换,求最终的方案数取模一个质数。
考虑burnside定理的内容来解这道题,对于一种置换,我们需要求出其循环节为1的置换的方案数。
如何令循环节为1呢?
只需要对于这个置换的变换方法,互相可能影响的点染成同种颜色,这就是循环节为1的情况,接下来只需要求这个方案数了,是个经典的背包,3个容量跑背包就可以知道置换的方案数。
之后观察定理内容
令ci(ai) 表示ai这种置换方式对应的循环节为1的方案数。
那么ans=∑ci(ai)G 其中G为总置换数。
由于答案含有取模且取模数为质数,所以需要用到逆元。
即ans=(∑ci(ai))∗niyuan(G)
代码:
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define N 110using namespace std;typedef long long ll;int sr,sb,sg,n,m,mod;int cir[N][N],v[N],size[N];ll f[N][N][N],ans;int calc(int x){ int cnt=0; memset(v,0,sizeof(v)); memset(size,0,sizeof(size)); for(int i=1;i<=n;i++) { if(v[i])continue; int p=cir[x][i]; cnt++; while(!v[p])v[p]=1,size[cnt]++,p=cir[x][p]; } memset(f,0,sizeof(f)); f[0][0][0]=1; for(int i=1;i<=cnt;i++) for(int j=sr;j>=0;j--) for(int k=sb;k>=0;k--) for(int l=sg;l>=0;l--) { if(j>=size[i])f[j][k][l]=(f[j][k][l]+f[j-size[i]][k][l])%mod; if(k>=size[i])f[j][k][l]=(f[j][k][l]+f[j][k-size[i]][l])%mod; if(l>=size[i])f[j][k][l]=(f[j][k][l]+f[j][k][l-size[i]])%mod; } return f[sr][sb][sg];}ll quick_my(ll x,int y){ ll ret=1; while(y) { if(y&1)ret=(ret*x)%mod; x=(x*x)%mod; y>>=1; } return ret;}int main(){ scanf("%d%d%d%d%d",&sr,&sb,&sg,&m,&mod); n=sr+sb+sg; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) scanf("%d",&cir[i][j]); m++; for(int i=1;i<=n;i++)cir[m][i]=i; ll ans=0; for(int i=1;i<=m;i++)ans=(ans+calc(i))%mod; ans=(ans*quick_my(m,mod-2))%mod; printf("%lld\n",ans);}
0 0
- BZOJ 1004 [HNOI2008]Cards 置换+burnside定理+逆元
- 【Burnside定理/置换】[HNOI2008][HYSBZ/BZOJ1004]Cards
- 置换群burnside引理(bzoj 1004: [HNOI2008]Cards)
- Burnside引理和Polya定理 & [bzoj 1004] [HNOI2008]Cards:Burnside引理,动态规划
- BZOJ 1004 HNOI2008 Cards Burnside引理
- 【BZOJ 1004】 [HNOI2008]Cards 【burnside引理】
- 【bzoj 1004】[HNOI2008]Cards(burnside 引理)
- BZOJ 1004: [HNOI2008]Cards Burnside dp
- 【置换群】【bzoj 1004】: [HNOI2008]Cards
- bzoj 1004: [HNOI2008]Cards(置换)
- bzoj 1004: [HNOI2008]Cards 置换群+dp
- 【BZOJ1004】Cards(HNOI2008)-Burnside引理+DP+逆元
- [HNOI2008]Cards (polya定理+乘法逆元,费马小定理)
- [BZOJ1004]HNOI2008 Cards |polya|置换群|DP|乘法逆元
- [BZOJ1004][HNOI2008]Cards(置换群+背包+乘法逆元)
- 【BZOJ1004】【HNOI2008】Cards 群论 置换 burnside引理 背包DP
- [BZOJ1004] [HNOI2008] Cards - 群论,Burnside引理,Polya定理
- bzoj 1004: [HNOI2008]Cards
- undefined reference to `boost::system::generic_category()
- oracle,通过plsql创建用户表空间和所属用户示例
- Docker ssh远程连接使用
- 【尝鲜版】驱动级网站防护软件-浪潮云戟
- Codeforces Round #313 (Div. 2) (ABCD)
- BZOJ 1004 [HNOI2008]Cards 置换+burnside定理+逆元
- 如何在Eclipse里面更新添加主题
- os.rename()导致WindowsError: [Error 183]的问题
- 多线程(二)
- 在VirtualBox中安装Ubuntu14报错:Failed to open a session for the virtual machine,Unable to load R3……
- Android性能分析优化 - TraceView介绍
- SQL常用语句总结
- 关于C++二维指针
- Qt libqevdevtouchplugin.so插件的改写