【牛客网多校第一场】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 }
View Code

猜你喜欢

转载自www.cnblogs.com/Asumi/p/9457931.html