题意:一个矩阵由012三个数字组成,这个矩阵从左到右,从上到下,都是不递减的。
思路:
考虑 01 和 12 的分界线
是 (n, 0) 到 (0, m) 的两条不相交(可重合)路径
平移其中一条变成 (n-1, -1) 到 (-1, m-1)
变成起点 (n, 0) 和 (n-1, -1),终点 (0, m) 和 (-1, m-1) 的严格不相交路径 套 Lindström–Gessel–Viennot lemma
答案是Cn+m,n2 -Cn+m,m-1Cn+m,n-1
可以用杨辉三角求组合数
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll dp[2050][2050];
const int ll mod=1e9+7;
void init()
{
dp[0][1]=dp[1][1]=1;
for(int i=2;i<=2002;i++)
{
dp[0][i]=dp[i][i]=1;
for(int j=1;j<i;j++)
{
dp[j][i]=(dp[j][i-1]+dp[j-1][i-1])%mod;
}
}
}
int main()
{
init();
int n,m;
while(~scanf("%d%d",&n,&m))
{
ll ans=(dp[n][m+n]*dp[n][m+n]%mod+mod-dp[n-1][n+m]*dp[m-1][n+m]%mod)%mod;
printf("%lld\n",ans);
}
return 0;
}