你知道吗,就你行?

潘璇  •  1个月前


include

include

include

include

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;

}


评论: