首页 > 其他 > 详细

2018牛客多校第一场 A.Monotonic Matrix

时间:2018-07-20 13:28:56      阅读:136      评论:0      收藏:0      [点我收藏+]

题意:

  给一个n*m的矩阵赋值(0,1,2)。使得每个数都不小于它左面和上面的数。

题解:

  构建0和1的轮廓线。对于单独的轮廓线,共需要往上走n步,往右走m步。有C(n+m,n)种方式。

  两个轮廓线的总情况是C(n+m,n)*C(n+m,n)种方式。但是还要去重掉相交的情况。

  假设将0轮廓线向左上平移一个单位,那么此时两个轮廓线既不能相交也不能重合。

  假设0轮廓线是从A到B,1轮廓线是从C到D。那么相交的情况可以理解成从A到D,从C到B。情况数是C(n+m,n-1)*C(n+m,m-1)

  总答案就是C(n+m,n)*C(n+m,n)-C(n+m,n-1)*C(n+m,m-1)

技术分享图片
#include <bits/stdc++.h>
using namespace std;
const int N = 2001;
const int mod = 1e9+7;
typedef long long ll;
int n, m;
int C[N][N];
int main() {
    C[1][0] = C[1][1] = 1;  
    for(int i = 2; i < N; i++){  
        C[i][0] = 1;  
        for(int j = 1; j < N; j++)  
        C[i][j] = (C[i-1][j]+C[i-1][j-1])%mod;  
    }  
    while(~scanf("%d%d", &n, &m)) {
        printf("%d\n", ((1ll*C[n+m][n]*C[n+m][n])%mod-(1ll*C[n+m][n-1]*C[n+m][m-1])%mod+mod)%mod);
    }
} 
View Code

 

2018牛客多校第一场 A.Monotonic Matrix

原文:https://www.cnblogs.com/Pneuis/p/9340797.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!