for( int i = 0; i < n; ++ i ) { for( int j = 0; j <= m; ++ j ) { for( int k = 0; k + j <= m; ++ k ) { if( !dp[i][j][k] ) continue; longlong cur = dp[i][j][k]; int z = m - j - k;
calc( i+1, j, k, cur );
if( z >= 1 ) { calc( i+1, j+1, k, cur * z ); } if( j >= 1 ) { calc( i+1, j-1, k+1, cur * j ); } if( z >= 2 ) { calc( i+1, j+2, k, cur * c2( z ) ); } if( j >= 2 ) { calc( i+1, j-2, k+2, cur * c2( j ) ); } if( j >= 1 && z >= 1 ) { calc( i+1, j, k+1, cur * z * j ); } } } }
longlong ans = 0; for( int j = 0; j <= m; ++ j ) { for( int k = 0; k + j <= m; ++ k ) { ans = ( ans + dp[n][j][k] ) % mod; } }