Rikka with Nash Equilibrium
题意
定义一个大数为一个矩阵中所在行,所在列的最大值。给出一个N,M,MOD,问可以构造多少矩阵来使得一个矩阵最多只有一个大数
思路
我们先从最大的数开始考虑,这个数可以放在任意位置,第二大的数则只能放在最大数所在的行或者列,第三大的数则可以有更多的选择,这样我们可以列出一个DP方程。
dp[i+1][j][k+1]+=dp[i][j][k]∗(n−i)∗j
d
p
[
i
+
1
]
[
j
]
[
k
+
1
]
+
=
d
p
[
i
]
[
j
]
[
k
]
∗
(
n
−
i
)
∗
j
dp[i][j+1][k+1]+=dp[i][j][k]∗(m−j)∗i
d
p
[
i
]
[
j
+
1
]
[
k
+
1
]
+
=
d
p
[
i
]
[
j
]
[
k
]
∗
(
m
−
j
)
∗
i
dp[i][j][k+1]+=dp[i][j][k]∗(i∗j−k)
d
p
[
i
]
[
j
]
[
k
+
1
]
+
=
d
p
[
i
]
[
j
]
[
k
]
∗
(
i
∗
j
−
k
)
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int dp[83][83][83*83];
int n,m,MOD;
int main()
{
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&m,&MOD);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int k=i+j-1;k<=i*j;k++) dp[i][j][k] = 0;
dp[1][1][1]=n*m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
for(int k=i+j-1;k<=i*j;k++){
dp[i+1][j][k+1] = (dp[i+1][j][k+1]+1LL*dp[i][j][k]*(n-i)*j%MOD)%MOD;
dp[i][j+1][k+1] = (dp[i][j+1][k+1]+1LL*dp[i][j][k]*(m-j)*i%MOD)%MOD;
dp[i][j][k+1] = (dp[i][j][k+1] +1LL*dp[i][j][k]*(i*j-k)%MOD)%MOD;
}
}
}
printf("%d\n",dp[n][m][n*m]);
}
}