题目链接:https://codeforces.com/contest/1288/problem/C
题目大意:
给定两个整数n和m,现在你需要构造如下两个数组A,B:
- 两个数组的长度均为m
- 两个数组的元素均在[1,n]之间,允许重复
- 对于任意位置i,有Ai<=Bi
- A数组元素是非递减排列的,也就是Ai<=Ai+1
- B数组元素是非递增排列的,也就是Bi<=Bi+1
请问有多少个数组满足条件?对1e9+7取模
思路:
两个数组分开考虑比较困难,不如考虑将两个数组拼接起来。
将B数组倒过来后拼接在A的后面,你会发现一个事实:这个拼接起来的数组一定是非递减的。
为什么呢?A数组非递减,倒过来的B数组非递减,而且有条件Am<=Bm,也就是A数组的最后一个元素小于等于倒过来的B数组的第一个元素,所以拼接起来就是一个非递减的。
并且,只要这个拼接的数组非递减,就一定可以构造出两个A,B数组,从而满足上面的条件。
于是现在只剩一个问题:求元素范围为[1,n]的,长度为m*2的非递减数组有多少个
dp[i][j]表示以i元素为结尾的,长度为j的非递减数组个数
dfs下去就行了。
#include <bit