1001-Rikka with Nash Equilibrium(hdu 6415)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6415
题意:就是说给一个 的矩阵 ,如果一个元素满足比他的这一行或者这一列的所有元素都打的话,这个元素就满足“纳什均衡”,问:用 来填这个矩阵,满足只有一个元素是“纳什均衡” 的方案数?
其实不是很懂这道题,看网上大佬的博客说是这样: 表示有 行 列,选了 个数的方案数
我也不懂为啥 这个初始值要设为 ,难道是 个位置随便选一个,所以又 种???
但是这样跟“纳什均衡”有什么关系?
然后后面说就这样 感觉还能理解一点T_T
等题解出来再看看吧
#include"bits/stdc++.h"
using namespace std;
typedef long long LL;
const int maxn=85;
LL dp[maxn][maxn][maxn*maxn];//占了i行j列有k个点的方案数
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
LL N,M,MOD;
scanf("%lld%lld%lld",&N,&M,&MOD);
for(int i=1;i<=N;i++)//用memset还超时T_T
for(int j=1;j<=M;j++)
for(int k=1;k<=N*M;k++)dp[i][j][k]=0;
dp[1][1][1]=N*M;
for(LL k=2;k<=N*M;k++)
{
for(LL i=1;i<=N;i++)
{
for(LL j=1;j<=M;j++)
{
dp[i][j][k]+=(N-(i-1))*(j)*dp[i-1][j][k-1];//上一次放了i-1行,这一次在剩下的行中选一行
dp[i][j][k]+=(M-(j-1))*(i)*dp[i][j-1][k-1];//同理,上次放了j-1行,这一次在剩下的列中选一列
if(i*j-(k-1)>=1)dp[i][j][k]+=(i*j-(k-1))*dp[i][j][k-1];//要是不想产生新的行或列,那就是放在交点上
if(dp[i][j][k]>MOD)dp[i][j][k]%=MOD;
}
}
}
printf("%lld\n",dp[N][M][N*M]);
}
}