The three-dimensional 01 backpack calculates the number of staining schemes that are constant under each permutation, and Burnside the lemma to calculate the answer.
PS: The data is too water so only the identity permutation can be too.
#include <bits/stdc++.h>using namespace Std;int n,m,p,x,y,z;bool u[61];int f[21][21][21],s[61],v[61];int Power ( int U,int v) {int d=1;for (; v;v>>=1) {if (v&1) d=d*u%p;u=u*u%p;} return D;} void Add (int& u,int v) {u= (u+v)%p;} int main () {scanf ("%d%d%d%d%d", &x,&y,&z,&m,&p); n=x+y+z;int ans=1;for (int i=1;i<=n;++i) ans= ans*i%p;for (int i=1;i<=x;++i) ans=ans*power (i,p-2)%p;for (int i=1;i<=y;++i) ans=ans*power (i,p-2)%p;for (int i=1 ; i<=z;++i) Ans=ans*power (i,p-2)%p;for (int t=0;t!=m;++t) {for (int i=1;i<=n;++i) scanf ("%d", s+i); Memset (u,0, sizeof u); int cnt=0;for (int i=1;i<=n;++i) if (!u[i]) {int k=u[i]=1;for (int j=s[i];j!=i;j=s[j]) k+=u[j]=1;v[cnt++]=k;} Memset (f,0,sizeof f); f[0][0][0]=1;for (int a=0;a!=cnt;++a) for (int. i=x;~i;--i) for (int j=y;~j;--j) (int k=z;~k;--k) { if (I>=v[a]) Add (F[i][j][k],f[i-v[a]][j][k]), if (J>=v[a]) Add (F[i][j][k],f[i][j-v[a]][k]), if (K>=v[a]) Add ( F[i][j][k],f[i][j][k-v[a]]);} Add (Ans,f[x][y][z]);} printf ("%d\n", Ans*power (m+1,p-2)%p);}
bzoj1004: [hnoi2008]cards Burnside lemma +01 Backpack