本代码交的时候如果t了就再多交几发~
题意:
如果一个数是他所在的行列的最大值,那么他满足纳什均衡
要求构造n*m矩阵 把1到n*m填入矩阵
问满足只有一个纳什均衡数的矩阵的个数
思路:
从大到小放数字 每次放一个数字 他的行列就被解放了(可以放其他数字)
每次放数字进去 他有三种可能
1.多拓展一行
2.多拓展一列
3.放在下图x的位置
x |
因为答案可以是0 所以把dp数组初始化为-1
#include <bits/stdc++.h>
#define mem(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
ll mod, n, m;
ll dp[85][85][85*85];
ll dfs(ll x, ll y, ll num) {
if(dp[x][y][num] != -1) return dp[x][y][num];
ll tmp = 0;
if(x < n) tmp = (tmp + y*(n-x)%mod * dfs(x+1,y,num+1))%mod;
if(y < m) tmp = (tmp + x*(m-y)%mod * dfs(x,y+1,num+1))%mod;
if(x*y > num) tmp = (tmp+(x*y-num)%mod * dfs(x,y,num+1))%mod;
return dp[x][y][num] = tmp;
}
int main() {
int t;
scanf("%d",&t);
while(t--) {
mem(dp,-1);
scanf("%lld%lld%lld",&n,&m,&mod);
dp[n][m][n*m] = 1;
ll ans = m*n%mod*dfs(1,1,1)%mod;
printf("%lld\n",ans);
}
}