Bzoj1004:[HNOI2008]Cards:置换群+dp
来源:互联网 发布:mac播放蓝光原盘 编辑:程序博客网 时间:2024/06/05 09:35
题目链接:1004:[HNOI2008]Cards
首先看到题目就知道是个有关群论的题
Burnside:真正染色方案数=(Σ每种置换下不变的染色方案数)/置换总数;
发现这里卡片的数量有限制所以Pólya并不能用了
于是要用dp求出不变的方案数
发现两个在某置换下可以互相到达的序列如果本质相同那么必须涂上相同颜色
可以处理处循环节长度,然后裸dp了
注意不洗牌也是一种方案
最后求个逆元即可,exgcd或者费马小定理都可以,实测并没有什么差距
#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#define rep(i,x,y) for(int i=x;i<=y;++i)#define dow(i,x,y) for(int i=x;i>=y;--i)using namespace std;const int maxn=51;const int maxm=188;int n,m,dp[maxn][maxn][maxn],tmp[maxm],s[maxm];int a[maxm][maxm],sr,sg,sb,mod;int getval(int a[]){memset(dp,0,sizeof(dp));memset(tmp,0,sizeof(tmp));memset(s,0,sizeof(s));int cnt=0;for (int i=1;i<=n;++i) if (!tmp[i]){cnt++;for (int j=i;!tmp[j];j=a[j]) tmp[j]=1,s[cnt]++; }dp[0][0][0]=1;rep(i,1,cnt) dow(x,sr,0) dow(y,sb,0) dow(z,sg,0){if (x>=s[i]) dp[x][y][z]+=dp[x-s[i]][y][z];if (y>=s[i]) dp[x][y][z]+=dp[x][y-s[i]][z];if (z>=s[i]) dp[x][y][z]+=dp[x][y][z-s[i]];while (dp[x][y][z]>=mod) dp[x][y][z]-=mod;}return dp[sr][sb][sg];}void exgcd(int a,int b,int &x,int &y){int tmp;if (!b){x=1;y=0;return;}exgcd(b,a%b,x,y);tmp=x; x=y; y=tmp-(a/b)*y;}int powe(int x,int y){int 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",&a[i][j]);int ans=0;for (int i=1;i<=m;++i) ans=(ans+getval(a[i]))%mod;for (int i=1;i<=n;++i) a[m+1][i]=i;ans=(ans+getval(a[m+1]))%mod;int x,y; exgcd(m+1,mod,x,y);x=(x%mod+mod)%mod;ans=ans*x%mod;//ans=ans*powe(m+1,mod-2)%mod;printf("%d",ans);}
2 0
- BZOJ1004 [HNOI2008]Cards(置换群+dp)
- Bzoj1004:[HNOI2008]Cards:置换群+dp
- [BZOJ1004]HNOI2008 Cards |polya|置换群|DP|乘法逆元
- [置换群+背包] BZOJ1004: [HNOI2008]Cards
- 【BZOJ1004】【HNOI2008】Cards 群论 置换 burnside引理 背包DP
- [BZOJ1004][HNOI2008]Cards(置换群+背包+乘法逆元)
- 【Burnside定理/置换】[HNOI2008][HYSBZ/BZOJ1004]Cards
- bzoj 1004: [HNOI2008]Cards 置换群+dp
- [BZOJ1004][HNOI2008][Burnside引理][DP]Cards
- kyeremal-bzoj1004-[HNOI2008]-cards-dp+polya
- 【bzoj1004】[HNOI2008]Cards burnside引理+dp
- BZOJ1004【HNOI2008】Cards
- bzoj1004【hnoi2008】Cards
- bzoj1004: [HNOI2008]Cards
- [BZOJ1004][HNOI2008]Cards
- 【BZOJ1004】【HNOI2008】Cards
- BZOJ1004 [HNOI2008]Cards
- BZOJ1004: [HNOI2008]Cards
- 服务器过载保护(下篇)——过载处理新方案
- 图形处理相关资源(面部识别、姿态估计、变形、、、)
- 申请付费苹果开发者账号 注意事项及流程 (转)
- Linux文件特殊权限:SUID、SGID和SBIT
- centos7 install devstack
- Bzoj1004:[HNOI2008]Cards:置换群+dp
- php对html标签的处理
- 关于使用getActionBar()报空指针异常的错误
- selector使用时遇到的问题
- CodeForces 231E|Cactus|边双联通分量|LCA
- Java基本数据类型
- mvp模式
- oracle复制一张表结构到另外一张新表中
- Java Web的Model1和Model2简介