标签:php sage -- i++ card print space 链接 log
对群论没有任何了解的自觉百度。。。
题目链接:
http://www.lydsy.com/JudgeOnline/problem.php?id=1003
请百度“ 伯恩赛德引理 ”。。。
这是一道置换群的题目。。。虽然还要加上DP。。。
如果明白伯恩赛德引理的话。。直接套公式即可。。。
#include<cstdio>
#include<iostream>
#include<cstring>
#define LL long long
using namespace std;
int sr,sb,sg,m,n,mod,ans;
int f[70][70][70],g[70],d[70];
bool c[70];
int DP(){
for(int i=1;i<=n;i++) c[i]=0;
int sum=0,q;
for(int i=1;i<=n;i++)
if(!c[i]){
d[++sum]=0;q=i;
while(!c[g[q]]){
d[sum]++;
q=g[q];
c[q]=1;
}
}
for(int i=0;i<=sr;i++)
for(int j=0;j<=sb;j++)
for(int k=0;k<=sg;k++)
f[i][j][k]=0;
f[0][0][0]=1;
for(int h=1;h<=sum;h++)
for(int i=sr;i>=0;i--)
for(int j=sb;j>=0;j--)
for(int k=sg;k>=0;k--){
if(i>=d[h]) f[i][j][k]=(f[i][j][k]+f[i-d[h]][j][k])%mod;
if(j>=d[h]) f[i][j][k]=(f[i][j][k]+f[i][j-d[h]][k])%mod;
if(k>=d[h]) f[i][j][k]=(f[i][j][k]+f[i][j][k-d[h]])%mod;
}
return f[sr][sb][sg];
}
int pow(int a,int b){
int s=1;
while(b){
if(b&1) s=s*a%mod;
b>>=1;
a=a*a%mod;
}
return s;
}
int main(){
ans=0;
scanf("%d%d%d%d%d",&sr,&sb,&sg,&m,&mod);
f[0][0][0]=1;
n=sr+sb+sg;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++)
scanf("%d",&g[j]);
ans=(ans+DP())%mod;
}
for(int i=1;i<=n;i++) g[i]=i;
ans=(ans+DP())%mod;
m++;
ans=ans*pow(m,mod-2)%mod;
printf("%d\n",ans);
return 0;
}
This passage is made by Yukino.
标签:php sage -- i++ card print space 链接 log
原文地址:http://www.cnblogs.com/Yuigahama/p/7543644.html