【牛客网多校第一场】A
题目链接:https://www.nowcoder.com/acm/contest/139/A
题意:大概就是给你0,1,2让你填矩阵问有多少种填法满足
a(i,j)<=a(i+1,j)以及a(i,j)<=a(i,j+1)
题解:Lindström–Gessel–Viennot lemm这个定理的应用。
本鶸也是第一次看见这种东西。去稍微了解了一下。是一个求不相交路径的东西。
给定n个起点,n个终点,不相交路径的方法数的矩阵行列式如下。
其中e(a,b)为图上a到b的方案数。
题解上的ppt给的思路是,
其实也就是把所有的0往左上角搬,2往所有的右下角搬。(感谢bang哥的指导)
打个组合的板子,用公式一带就行了!。
代码如下:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 #define ll long long 6 const ll mod=1e9+7; 7 const int maxn=2010; 8 ll c[maxn][maxn]; 9 10 int main(){ 11 ll n,m; 12 //递推求组合数 13 c[1][1] = 1; 14 c[0][0] = c[1][0] = 1; 15 for(int i = 2 ; i < maxn ; i++){ 16 c[i][0] = 0; 17 for(int j = 0 ; j <= i; j++) 18 c[i][j] = ( c[i-1][j] + c[i-1][j-1] ) % mod; 19 } 20 21 while(scanf("%lld%lld",&n,&m)==2){ 22 printf("%lld\n",(c[n+m][n]*c[m+n][n]%mod-c[n+m][m-1]*c[n+m][n-1]%mod+mod)%mod); 23 } 24 return 0; 25 }