[bzoj1004][HNOI2008]Cards【群论】
2018-03-07 18:25
405 查看
【题目链接】
http://www.lydsy.com/JudgeOnline/problem.php?id=1004
【题解】
由于数量有限制,无法使用Polya定理,要用Burnside引理。即ans=每种置换不动点的数量的平均值ans=每种置换不动点的数量的平均值
对于每种置换,我们可以用dp来统计答案。记f[i][j][k]f[i][j][k]表示已经处理了ii个位置,第1种颜色用了jj个,第2种颜色用了kk个。每次处理一个新的循环。分别用i,j,ki,j,k取填这个循环。设当前循环长度为tt,有f[i][j][k]=f[i−t][j−t][k]+f[i−t][j][k−t]+f[i−t][j][k]f[i][j][k]=f[i−t][j−t][k]+f[i−t][j][k−t]+f[i−t][j][k]。注意负数不合法。
http://www.lydsy.com/JudgeOnline/problem.php?id=1004
【题解】
由于数量有限制,无法使用Polya定理,要用Burnside引理。即ans=每种置换不动点的数量的平均值ans=每种置换不动点的数量的平均值
对于每种置换,我们可以用dp来统计答案。记f[i][j][k]f[i][j][k]表示已经处理了ii个位置,第1种颜色用了jj个,第2种颜色用了kk个。每次处理一个新的循环。分别用i,j,ki,j,k取填这个循环。设当前循环长度为tt,有f[i][j][k]=f[i−t][j−t][k]+f[i−t][j][k−t]+f[i−t][j][k]f[i][j][k]=f[i−t][j−t][k]+f[i−t][j][k−t]+f[i−t][j][k]。注意负数不合法。
/* -------------- user Vanisher problem bzoj-1004 ----------------*/ # include <bits/stdc++.h> # define ll long long # define inf 0x3f3f3f3f # define N 110 using namespace std; int read(){ int tmp=0, fh=1; char ch=getchar(); while (ch<'0'||ch>'9'){if (ch=='-') fh=-1; ch=getchar();} while (ch>='0'&&ch<='9'){tmp=tmp*10+ch-'0'; ch=getchar();} return tmp*fh; } int f[2] ,mp ,P,sa,sb,sc,m,n,now,use ,f1,f2; int mypow(int x, int y){ int i=x; x=1; while (y>0){ if (y%2==1) x=x*i%P; i=i*i%P; y/=2; } return x; } int main(){ sa=read(), sb=read(), sc=read(); m=read(); P=read(); n=sa+sb+sc; now=0; for (int i=1; i<=m+1; i++){ if (i!=m+1){ for (int j=1; j<=n; j++) mp[j]=read(),use[j]=false; } else { for (int j=1; j<=n; j++) mp[j]=j, use[j]=false; } int les=0; f1=0, f2=1; memset(f,0,sizeof(f)); f[f1][0][0]=1; for (int ed=1; ed<=n; ed++){ if (use[ed]==true) continue; int num=0,k=ed; while (use[k]==false){ use[k]=true; num++, k=mp[k]; } les=les+num; for (int j=0; j<=sa; j++) for (int k=0; k<=sb; k++){ int t=les-j-k; f[f2][j][k]=0; if (j>=num) f[f2][j][k]=(f[f2][j][k]+f[f1][j-num][k])%P; if (k>=num) f[f2][j][k]=(f[f2][j][k]+f[f1][j][k-num])%P; if (t>=num) f[f2][j][k]=(f[f2][j][k]+f[f1][j][k])%P; } swap(f1,f2); } now=(now+f[f1][sa][sb])%P; } printf("%d\n",now*mypow(m+1,P-2)%P); return 0; }
相关文章推荐
- [Polya群论]BZOJ1004: [HNOI2008]Cards
- [BZOJ1004] [HNOI2008] Cards - 群论,Burnside引理,Polya定理
- BZOJ 1004: [HNOI2008]Cards(群论)
- 【BZOJ1004】【HNOI2008】Cards(群论、Burnside引理、背包dp)
- 【BZOJ1004】【HNOI2008】Cards 群论 置换 burnside引理 背包DP
- 【置换群】【bzoj 1004】: [HNOI2008]Cards
- [置换群+背包] BZOJ1004: [HNOI2008]Cards
- [BZOJ1004](HNOI 2008) Cards
- BZOJ 1004: [HNOI2008]Cards( 置换群 + burnside引理 + 背包dp + 乘法逆元 )
- 【BZOJ1004】【HNOI2008】Cards
- BZOJ 1004 [HNOI2008]Cards 置换+burnside定理+逆元
- BZOJ 1004 HNOI2008 Cards Burnside引理
- Bzoj1004 [HNOI2008]Cards
- BZOJ1004 [HNOI2008]Cards
- bzoj1004 [HNOI2008]Cards【Burnside/Polya】
- [BZOJ1004]HNOI2008 Cards |polya|置换群|DP|乘法逆元
- BZOJ 1004([HNOI2008]Cards-Polya计数+k背包)
- BZOJ 1004 【HNOI2008】 Cards
- BZOJ1004: [HNOI2008]Cards
- 【bzoj 1004】[HNOI2008]Cards(burnside 引理)