【BZOJ1004】【HNOI2008】Cards 群论 置换 burnside引理 背包DP
来源:互联网 发布:湖北大学知行学院宿舍 编辑:程序博客网 时间:2024/06/01 21:59
题目描述
有
还有
替,且对每种洗牌法,都存在一种洗牌法使得能回到原状态。
问你本质不同的染色方法有多少种。
题解
对照置换群的定义,可以发现这
由burnside引理得到本质不同的方案数就是只考虑每个置换时的染色方案数的平均数。
对于每个置换,先处理出循环,一个循环里的卡牌要染上相同的颜色。因为每种颜色的卡牌有数量限制,所以要背包DP一下。
最后乘上
时间复杂度:
代码
#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#include<ctime>#include<utility>#include<cmath>#include<functional>using namespace std;typedef long long ll;typedef unsigned long long ull;typedef pair<int,int> pii;typedef pair<ll,ll> pll;void sort(int &a,int &b){ if(a>b) swap(a,b);}void open(const char *s){#ifndef ONLINE_JUDGE char str[100]; sprintf(str,"%s.in",s); freopen(str,"r",stdin); sprintf(str,"%s.out",s); freopen(str,"w",stdout);#endif}int rd(){ int s=0,c; while((c=getchar())<'0'||c>'9'); do { s=s*10+c-'0'; } while((c=getchar())>='0'&&c<='9'); return s;}int upmin(int &a,int b){ if(b<a) { a=b; return 1; } return 0;}int upmax(int &a,int b){ if(b>a) { a=b; return 1; } return 0;}int p;int fp(int a,int b){ int s=1; for(;b;b>>=1,a=a*a%p) if(b&1) s=s*a%p; return s;}int f[100][100][100];int a[100];int r,g,b;int n;int c[100];void add(int &a,int b){ a=(a+b)%p;}void dp(int v){ int i,j,k; for(i=r;i>=0;i--) for(j=g;j>=0;j--) for(k=b;k>=0;k--) { if(i>=v) add(f[i][j][k],f[i-v][j][k]); if(j>=v) add(f[i][j][k],f[i][j-v][k]); if(k>=v) add(f[i][j][k],f[i][j][k-v]); }}int solve(){ memset(f,0,sizeof f); f[0][0][0]=1; int i; memset(c,0,sizeof c); for(i=1;i<=n;i++) { int s=0; int j=i; while(!c[j]) { c[j]=1; s++; j=a[j]; } dp(s); } return f[r][g][b];}int main(){ int m; scanf("%d%d%d%d%d",&r,&g,&b,&m,&p); int i,j; n=r+g+b; int ans=0; for(i=1;i<=m;i++) { for(j=1;j<=n;j++) scanf("%d",&a[j]); add(ans,solve()); } m++; for(i=1;i<=n;i++) a[i]=i; add(ans,solve()); ans=ans*fp(m,p-2)%p; printf("%d\n",ans); return 0;}
阅读全文
0 0
- 【BZOJ1004】【HNOI2008】Cards 群论 置换 burnside引理 背包DP
- [BZOJ1004] [HNOI2008] Cards - 群论,Burnside引理,Polya定理
- [BZOJ1004][HNOI2008][Burnside引理][DP]Cards
- 【bzoj1004】[HNOI2008]Cards burnside引理+dp
- 【Burnside定理/置换】[HNOI2008][HYSBZ/BZOJ1004]Cards
- [BZOJ1004][HNOI2008]Cards-Burnside引理
- BZOJ1004:[HNOI2008]Cards (Burnside引理+DP+Exgcd)
- 【BZOJ1004】Cards(HNOI2008)-Burnside引理+DP+逆元
- [置换群+背包] BZOJ1004: [HNOI2008]Cards
- [Polya群论]BZOJ1004: [HNOI2008]Cards
- BZOJ1004 [HNOI2008]Cards(置换群+dp)
- Bzoj1004:[HNOI2008]Cards:置换群+dp
- [BZOJ1004][HNOI2008]Cards(置换群+背包+乘法逆元)
- [BZOJ1004]HNOI2008 Cards |polya|置换群|DP|乘法逆元
- bzoj1004: [HNOI2008]Cards [Burnside&Ploya+求逆元]
- 置换群burnside引理(bzoj 1004: [HNOI2008]Cards)
- 【BZOJ1004】【Burnside定理】【DP】【扩展欧几里徳】cards
- BZOJ1004 Cards (burnside dp 扩展欧几里德)
- Java检测网络地址和服务器是否可用
- 若相关程序员不幸逝世 他的开源软件会有人维护吗?
- MyBatis的分布查询延迟加载(select_resultMap)
- 【Educational Codeforces Round 33 B】Beautiful Divisors
- javascript引用类型(一)-------补充
- 【BZOJ1004】【HNOI2008】Cards 群论 置换 burnside引理 背包DP
- 网络流问题的常见套路
- 深入Redis主从高可用方案:哨兵机制核心原理
- log4j配置
- ES6尾部调用优化
- 浏览器地址相关知识
- 常用响应类型解释
- SEO正确的网站更新内容方案(二)
- grep 满足 或 排除多个关键字