随机立方体:
30分:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define upd(x,y) x+=y,x%=P typedef long long i64; const int N=13; const int P=998244353; int f[2][N][N][N][N]; int pwr(int x,int a){ int s=1; while(a){ if(a&1)s=(i64)s*x%P; x=(i64)x*x%P; a>>=1; } return s; } int main() { int T; scanf("%d",&T); while(T--){ int r,c,l,n,m; scanf("%d%d%d%d",&r,&c,&l,&m); n=r*c*l; if(m>r&&m>c&&m>l){ printf("0\n"); continue; } memset(f,0,sizeof(f)); int w=1,p=0; f[w][0][0][0][0]=1; int i,j,x,y,z; for(i=n;i;i--){ swap(w,p); memset(f[w],0,sizeof(f[w])); for(j=1;j<=n-i+1&&j<=m;j++) for(x=1;x<=n-i+1&&x<=r;x++) for(y=1;y<=n-i+1&&y<=c;y++) for(z=1;z<=n-i+1&&z<=l;z++){ upd(f[w][j][x][y][z],(i64)f[p][j][x][y][z]*max(0,x*y*z-(n-i))%P); upd(f[w][j][x][y][z],(i64)f[p][j][x-1][y][z]*(r-x+1)*y*z%P); upd(f[w][j][x][y][z],(i64)f[p][j][x][y-1][z]*x*(c-y+1)*z%P); upd(f[w][j][x][y][z],(i64)f[p][j][x][y][z-1]*x*y*(l-z+1)%P); upd(f[w][j][x][y][z],(i64)f[p][j][x][y-1][z-1]*x*(c-y+1)*(l-z+1)%P); upd(f[w][j][x][y][z],(i64)f[p][j][x-1][y][z-1]*(r-x+1)*y*(l-z+1)%P); upd(f[w][j][x][y][z],(i64)f[p][j][x-1][y-1][z]*(r-x+1)*(c-y+1)*z%P); upd(f[w][j][x][y][z],(i64)f[p][j-1][x-1][y-1][z-1]*(r-x+1)*(c-y+1)*(l-z+1)%P); } } p=1; for(i=1;i<=n;i++) p=(i64)p*i%P; printf("%d\n",(i64)f[w][m][r][c][l]*pwr(p,P-2)%P); } return 0; }
原文:https://www.cnblogs.com/wanghaoyu/p/CTSC2019.html