Codeforce 1288C. Two Arrays(DP组合数学,n个数选择m个数,单调不递减个数,排列组合打表N*N)

https://codeforces.com/problemset/problem/1288/C

Examples

input

2 2

output

5

input

10 1

output

55

input

723 9

output

157557417

Note

In the first test there are 5 suitable arrays:

  • a=[1,1],b=[2,2]
  • a=[1,2],b=[2,2]
  • a=[2,2],b=[2,2]
  • a=[1,1],b=[2,1]
  • a=[1,1],b=[1,1]

题目大意:

给定一个数n和一个数m,让构建两个数组a和b满足条件,

1.数组中所有元素的取值在1~n之间,a和b数组长度是m。2. a数组是单调不递减的,b数组是单调不递增 3. 任意的位置i,有ai<=bi

问你有多少对这样的数组

思路:

从n个数中任选m个数,这m个数从小到大排列,且可重复选取的方案数为C(n+m-1,m)

转化为代码:

#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const int maxn = 10001;
int dp[21][1001];
int main() {
	//freopen("in.txt", "r", stdin);
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	int n, m;
	cin >> n >> m;
	m *= 2;
	dp[1][0] = 1;
	for (int i = 1; i <= m; ++i)
		for (int j = 1; j <= n; ++j)
			dp[i][j] = (dp[i - 1][j] + dp[i][j - 1] ) % mod;
	long long ans = 0;
	for (int i = 1; i <= n; ++i)
		ans = (ans + dp[m][i]) % mod;
	cout << ans;
}
posted @ 2020-08-29 21:37  Koshkaaa  阅读(296)  评论(1编辑  收藏  举报