题目链接https://codeforces.com/contest/1288/problem/C
题目大意:
有两个长度为m的数组a, b
数组中的值都是1-n。

问满足下面几个条件的数组(a,b)的个数为:
1.两个数组的长度等于m
2.每个数组的每个元素都是到1-n之间的整数
3.对于任何索引1-n,有a[i]<=b[i]
4.a数组以非降序排列;
5.b数组以非升序排序。
结果可能非常大,您应该以模数打印它。10^9+ 7

这里我对non-descending 这个单词很有意见,sb出题人。
翻译是非降序。
给人的理解是:!(降序)
而题目的意思是: 不严格的降序 就是a[1]>=a[2]>=a[3]>=…>=a[n]。
呵呵!

那么观察可以发现:

分别dp A B数组方案数,枚举a的最后一位就可以了。a[n]>=a[b]。

当然我们把b左右翻转一下,放在a的后面。就是一个长度为2m的非严格递减序列。

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int mod=1e9+7;
 
LL dp[25][10005];
int main(){
 
    int n, m;
    scanf("%d%d", &n, &m);
    for(int i=1; i<=n; i++){
        dp[1][i]=1;
    }
    for(int i=2; i<=2*m; i++){
        for(int j=1; j<=n; j++){
            for(int k=j; k>=1; k--){
                dp[i][j]+=dp[i-1][k];
                dp[i][j]%=mod;
            }
        }
    }
    LL ans=0;
    for(int i=1 ;i<=n; i++){
        ans+=dp[2*m][i];
        ans%=mod;
    }
    printf("%lld\n", ans);
 
    return 0;
}