题目链接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;
}