#include<bits/stdc++.h> #define MAXS 25 #define MAXN 65 usingnamespace std; inlineintread(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); } return x*f; } int dp[MAXN][MAXS][MAXS][MAXS]; int mod; int sz[MAXN],top; int sr,sb,sg,n; int fac[MAXN],invfac[MAXN]; int to[MAXN]; intksm(int b,int k){ int ans=1; while (k){ if (k&1) ans=ans*b%mod; b=b*b%mod; k>>=1; } return ans; } voidcalc(){ memset(dp,0,sizeof(dp)); dp[0][0][0][0]=1; for (int p=1;p<=top;++p){ for (int i=0;i<=sr;++i){ for (int j=0;j<=sb;++j){ for (int k=0;k<=sg;++k){ if (i+sz[p]<=sr) (dp[p][i+sz[p]][j][k]+=dp[p-1][i][j][k])%=mod; if (j+sz[p]<=sb) (dp[p][i][j+sz[p]][k]+=dp[p-1][i][j][k])%=mod; if (k+sz[p]<=sg) (dp[p][i][j][k+sz[p]]+=dp[p-1][i][j][k])%=mod; } } } } //总共dp[top][sr][sb][sg]种方案 } int vis[MAXN]; intmain(){ int m,tm; sr=read(),sb=read(),sg=read(),m=read(),mod=read(); n=sr+sg+sb; fac[0]=1,invfac[0]=1; for (int i=1;i<MAXN;++i) fac[i]=(fac[i-1]*i)%mod,invfac[i]=ksm(fac[i],mod-2); tm=m; int ans=0; while (tm--){ for (int i=1;i<=n;++i) to[i]=read(); memset(vis,0,sizeof(vis)); top=0; for (int i=1;i<=n;++i){ if (!vis[i]){ int p=i,cnt=0; while (cnt==0||p!=i) p=to[p],vis[p]=true,cnt++; sz[++top]=cnt; } } calc(); (ans+=dp[top][sr][sb][sg])%=mod; } top=0; for (int i=1;i<=n;++i){ sz[++top]=1; } calc(); (ans+=dp[top][sr][sb][sg])%=mod; printf("%d\n",ans*ksm(m+1,mod-2)%mod); return0; }