Two Arrays

You are given two integers n n n and m m m. Calculate the number of pairs of arrays ( a , b ) (a,b) (a,b) such that:

  • the length of both arrays is equal to m m m;
  • each element of each array is an integer between 1 1 1 and n n n (inclusive);
  • a i ≤ b i a_i≤b_i aibi for any index i i i from 1 1 1 to m m m;
  • array a a a is sorted in non-descending order;
  • array b b b is sorted in non-ascending order.
    As the result can be very large, you should print it modulo 1 0 9 + 7 10^9+7 109+7.

Input

The only line contains two integers n n n and m m m ( 1 ≤ n ≤ 1000 , 1 ≤ m ≤ 10 ) (1≤n≤1000, 1≤m≤10) (1n1000,1m10).

Output

Print one integer – the number of arrays a a a and b b b satisfying the conditions described above modulo 1 0 9 + 7 10^9+7 109+7.

Examples

input

2 2

output

5

input

10 1

output

55

input

723 9

output

157557417

Note

In the first test there are 5 5 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].

仍然要注意到 b b b的最小元素(尾元素)不小于 a a a的最大元素(尾元素)

因为 a a a不下降, b b b不上升,那么给定 2 m 2m 2m个数,有且仅有 1 1 1种方案组成符合条件的 a , b a,b a,b数组

也就是说,从 1 − n 1−n 1n 2 m 2m 2m个数,可以选重复的,问有多少种选法??

也就是说,把 2 m 2m 2m个小球投到 1 − n 1−n 1n个盒子,盒子可以为空,有多少种投法。

为了方便,先把 n n n个盒子都放一个苹果,也就是 2 ∗ m + n 2∗m+n 2m+n放在 n n n个盒子,每个盒子至少放一个

这样就可以用隔板法。 2 ∗ m + n − 1 2∗m+n−1 2m+n1个间隙,从中选出 n − 1 n−1 n1个间隙放隔板,就分成了 n n n份。

答案是 C 2 ∗ m + n − 1 n − 1 C_{2*m+n-1}^{n-1} C2m+n1n1

#include<bits/stdc++.h>
 
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int maxn=2e5+10;
int n,m;
ll f[maxn+10],inv[maxn+10];
ll qpow(ll a,ll b) {
    ll res = 1;
    while (b) {
        if (b & 1) res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}
int main() {
    scanf("%d%d", &n, &m);
    f[1] = 1;
    for (int i = 2; i <= maxn; i++) f[i] = f[i - 1] * i % mod;
    inv[maxn] = qpow(f[maxn], mod - 2);
    for (int i = maxn - 1; i >= 0; i--) {
        inv[i] = inv[i + 1] * (i + 1) % mod;
    }
    printf("%lld\n", f[2 * m + n - 1] * inv[2 * m] % mod * inv[n - 1] % mod);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值