潘璇 • 1个月前
using namespace std;
const int N = 65; typedef long long ll;
int sr,sb,sg,m,n,P; int cg[N][N];
int Pow_mod(int x,int y){
int ret=1;
while(y){
if(y&1) ret=((ll)ret*x)%P;
x=((ll)x*x)%P;
y>>=1;
}
return ret;
}
int cnt[N],t; int vis[N],f[25][25][25];
int main() {
scanf("%d%d%d%d%d",&sr,&sb,&sg,&m,&P);
n=sr+sb+sg;
for(int i=0;i<m;i++)
for(int j=1;j<=n;j++) scanf("%d",&cg[i][j]);
for(int i=1;i<=n;i++) cg[m][i]=i;
int ans=0,x;
for(int i=0;i<=m;i++){
memset(vis,0,sizeof(vis));
memset(cnt,0,sizeof(cnt)); t=0;
memset(f,0,sizeof(f));
for(int j=1;j<=n;j++){
if(vis[j]) continue;
t++;
x=j;
while(!vis[x]) {
vis[x]=1;
cnt[t]++;
x=cg[i][x];
}
}
f[sr][sb][sg]=1;
for(int j=1;j<=t;j++){
for(int r=0;r<=sr;r++)
for(int b=0;b<=sb;b++)
for(int g=0;g<=sg;g++){
if(r+cnt[j]<=sr) (f[r][b][g]+=f[r+cnt[j]][b][g])%=P;
if(b+cnt[j]<=sb) (f[r][b][g]+=f[r][b+cnt[j]][g])%=P;
if(g+cnt[j]<=sg) (f[r][b][g]+=f[r][b][g+cnt[j]])%=P;
}
}
(ans+=f[0][0][0])%=P;
}
printf("%d\n",((ll)ans*Pow_mod(m+1,P-2))%P);
return 0;
}
评论: