Description
求满足下列条件的n×mn×m矩阵的个数:
1.Ai,j∈{0,1,2},1≤i≤n,1≤j≤mAi,j∈{0,1,2},1≤i≤n,1≤j≤m
2.Ai,j≤Ai+1,j,1≤i<n,1≤j≤mAi,j≤Ai+1,j,1≤i<n,1≤j≤m
3.Ai,j≤Ai,j+1,1≤i≤n,1≤j<mAi,j≤Ai,j+1,1≤i≤n,1≤j<m
Input
多组用例,每组用例输入两个整数n,m(1≤n,m≤103)n,m(1≤n,m≤103)
Output
输出满足条件的矩阵个数,结果模109+7109+7
Sample Input
1 2
2 2
1000 1000
Sample Output
6
20
540949876
Solution
考虑0,10,1分界线和1,21,2分界线,问题等价于求从(0,0)(0,0)到(m,n)(m,n)的两条不相交路径个数,将其中一条路径平移往使得这两条路径完全不触及,那么问题为求起点分别为(0,0),(−1,1)(0,0),(−1,1),终点分别为(m,n),(m−1,n+1)(m,n),(m−1,n+1)的两条完全不触及路径个数,不考虑触及的总方案数Cnn+mCnn+mCn+mnCn+mn,其中不合法方案,也即当两条路径触及时,将第一个触及点将之后的路径交换,即可与起点分别为(0,0),(−1,1)(0,0),(−1,1),终点分别为(m−1,n+1),(m,n)(m−1,n+1),(m,n)的两条路径一一对应,故不合法方案数为Cm−1n+mCn−1n+mCn+mm−1Cn+mn−1,故答案为Cnn+mCnn+m−Cm−1n+mCn−1n+mCn+mnCn+mn−Cn+mm−1Cn+mn−1
Code
#include<cstdio>
using namespace std;
typedef long long ll;
int C[2005][1005];
#define mod 1000000007
void init(int n=2000,int m=1000)
{
C[0][0]=1;
for(int i=1;i<=n;i++)
{
C[i][0]=C[i][i]=1;
for(int j=1;j<i;j++)C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
}
}
int main()
{
init();
int n,m;
while(~scanf("%d%d",&n,&m))
{
int ans=((ll)C[n+m][n]*C[n+m][n]%mod-(ll)C[n+m][n-1]*C[n+m][m-1]%mod+mod)%mod;
printf("%d\n",ans);
}
return 0;
}