bzoj1004:[HNOI2008]Cards
2016-10-12 09:29
190 查看
思路:由于题目给出了置换,又要求本质不同的方案数,考虑使用Burnside引理,Burnside引理即通过所有置换和原来相同的方案数之和除以方案数总数,而对于某一个置换要使置换后得到的与原来的相同,就应该把置换形成的环染成同一种颜色,也就是说属于一个环内的元素颜色一定相同,然后有一定要有一定量的红蓝绿色,因此用一个完全背包去背即可,
f[i][j][k]表示选了i张红色j张蓝色k张绿色的方案数,f[i][j][k]=f[i][j][k]+f[i-sum][j][k]+f[i][j-sum][k]+f[i][j][k-sum](sum表示当前环大小,然后i,j,k一定要判是不是大于sum),最后还有就是任何时候都不要忘了不动也是一个置换,因此有m+1个置换。
View Code
然后听说这道题有一个玄学写法,答案就是n!/(Sr!*Sg!*Sb!*(m+1)),然而蒟蒻并不知道这是为什么。。。。。神犇求教。。。
f[i][j][k]表示选了i张红色j张蓝色k张绿色的方案数,f[i][j][k]=f[i][j][k]+f[i-sum][j][k]+f[i][j-sum][k]+f[i][j][k-sum](sum表示当前环大小,然后i,j,k一定要判是不是大于sum),最后还有就是任何时候都不要忘了不动也是一个置换,因此有m+1个置换。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; #define maxn 65 int sr,sg,sb,m,p,n,ans,tot; int a[maxn],next[maxn],vis[maxn],f[21][21][21],sum[maxn]; int calc(){ for (int i=1;i<=n;i++) next[i]=a[i];tot=0,memset(vis,0,sizeof(vis)),memset(f,0,sizeof(f)),memset(sum,0,sizeof(sum)); for (int i=1;i<=n;i++) if (!vis[i]){ int size=0; while (!vis[i]) vis[i]=1,size++,i=next[i]; sum[++tot]=size; } f[0][0][0]=1; for (int i=1;i<=tot;i++) for (int j=sr;j>=0;j--) for (int k=sg;k>=0;k--) for (int l=sb;l>=0;l--){ if (j>=sum[i]) f[j][k][l]=(f[j][k][l]+f[j-sum[i]][k][l])%p; if (k>=sum[i]) f[j][k][l]=(f[j][k][l]+f[j][k-sum[i]][l])%p; if (l>=sum[i]) f[j][k][l]=(f[j][k][l]+f[j][k][l-sum[i]])%p; } return f[sr][sg][sb]; } int power(int a,int k,int p){ if (k==0) return 1; if (k==1) return a%p; int x=power(a,k/2,p),ans=x*x%p; if (k&1) ans=ans*a%p; return ans; } int main(){ scanf("%d%d%d%d%d",&sr,&sg,&sb,&m,&p),n=sr+sg+sb; for (int i=1;i<=n;i++) a[i]=i;ans=(ans+calc())%p; for (int i=1;i<=m;i++){ for (int j=1;j<=n;j++) scanf("%d",&a[j]); ans=(ans+calc())%p; } ans=ans*power(m+1,p-2,p)%p; printf("%d\n",ans); return 0; }
View Code
然后听说这道题有一个玄学写法,答案就是n!/(Sr!*Sg!*Sb!*(m+1)),然而蒟蒻并不知道这是为什么。。。。。神犇求教。。。
相关文章推荐
- BZOJ1004【HNOI2008】Cards
- BZOJ1004:[HNOI2008]Cards (Burnside引理+DP+Exgcd)
- bzoj1004: [HNOI2008]Cards
- BZOJ1004: [HNOI2008]Cards
- bzoj1004 [HNOI2008]Cards
- bzoj1004: [HNOI2008]Cards [Burnside&Ploya+求逆元]
- bzoj1004 [HNOI2008]Cards
- [HNOI2008]Cards (polya定理+乘法逆元,费马小定理)
- BZOJ 1004 HNOI2008 Cards Burnside引理
- 【BZOJ1004】【HNOI2008】Cards(群论、Burnside引理、背包dp)
- BZOJ1004 [HNOI2008]Cards
- [HNOI2008]Cards
- BZOJ 1004 [HNOI2008] Cards
- 【置换群】【bzoj 1004】: [HNOI2008]Cards
- BZOJ 1004 [HNOI2008]Cards
- [BZOJ1004][HNOI2008]Cards-Burnside引理
- BZOJ 1004: [HNOI2008]Cards(群论)
- BZOJ1004: [HNOI2008]Cards
- 【HNOI2008】Cards
- HYSBZ/BZOJ 1004 [HNOI2008] Cards - 组合数学