【BZOJ】【P1004】【HNOI2008】【Cards】【题解】【Burnside引理+dp】

来源:互联网 发布:建筑安装预算软件 编辑:程序博客网 时间:2024/06/05 06:54

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1004

等价类计数用Burnside定理,需要计算不动点个数

dp计算

Code:

#include<bits/stdc++.h>using namespace std;typedef long long LL;int Sa,Sb,Sc,m,n;LL p;int N;int w[3601],fac[101];int dp[21][21][21],a[61];int power(int x,int k,int p){int ans=1;for(;k;k>>=1){if(k&1)ans=(ans*x)%p;x=(x*x)%p;}return ans;}int inv(int x){return power(x,p-2,p);}int ans;int main(){cin>>Sa>>Sb>>Sc>>m>>p;n=Sa+Sb+Sc;fac[0]=1;for(int i=1;i<=n;i++)fac[i]=fac[i-1]*i%p;ans=fac[n]*inv(fac[Sa])%p*inv(fac[Sb])*inv(fac[Sc])%p;for(int i=1;i<=m;i++){for(int j=1;j<=n;j++)scanf("%d",&a[j]);int vis[61];memset(vis,0,sizeof vis);for(int j=1;j<=n;j++){if(!vis[j]){N++;for(int x=j;!vis[x];x=a[x]){vis[x]=1;w[N]++;}}}}dp[0][0][0]=1;for(int i=1;i<=N;i++)for(int j=Sa;j>=w[i];j--)for(int k=Sb;k>=w[i];k--)for(int l=Sc;l>=w[i];l--)dp[j][k][l]+=dp[j-w[i]][k][l]+dp[j][k-w[i]][l]+dp[j][k][l-w[i]],dp[j][k][l]%=p;cout<<(LL)(ans+dp[Sa][Sb][Sc])*inv(m+1)%p<<endl;return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手上皮肤干燥起皮怎么办 脸上起皮怎么办还痒痒 店铺4周被释放了怎么办 炫舞账号忘了怎么办 椎基底供血不足怎么办? 脑动脉供血不足怎么办 颈椎引起的脑供血不足怎么办 军人保障卡怎么办假的 正常形态精子率低怎么办 前向运动精子21怎么办 前向运动精子22%怎么办 前向运动精子19%怎么办 前向运动精子为0怎么办 被蝎子草扎了怎么办 二年级孩子成绩差怎么办 长治医保卡丢了怎么办 农商银行倒闭钱怎么办 2相电变3相电怎么办 电机六根线乱了怎么办 三相电零线带电怎么办 孕30周胎盘偏厚怎么办 偏侧咀嚼大小脸怎么办 咀嚼导致的脸歪怎么办 30岁了不想长大怎么办 4岁宝宝沉迷手机怎么办 我沉迷于了游戏怎么办 学生小红本丢了怎么办 小学玩6年初中怎么办 鼻炎喘不过来气怎么办 面对素质低的人怎么办 对没素质的人怎么办 爸妈吵架要离婚怎么办 爸妈为钱吵架怎么办 50岁父母闹离婚怎么办 父母吵架要离婚我该怎么办 爸妈40几了打架怎么办 爸妈打架我该怎么办 17岁心理有问题怎么办 孩子被同学打了怎么办 小孩被同学打了怎么办 有个强势的妈妈怎么办