算法与数学之美 2020-02-01
C.Two Arrays
You are given two integers n and m. Calculate the number of pairs of arrays (a,b) such that:
the length of both arrays is equal to m;
each element of each array is an integer between 1 and n (inclusive);
ai≤bi for any index i from 1 to m;
array a is sorted in non-descending order;
array b is sorted in non-ascending order.
As the result can be very large, you should print it modulo 109+7.
Input
The only line contains two integers n and m (1≤n≤1000, 1≤m≤10).
Output
Print one integer – the number of arrays a and b satisfying the conditions described above modulo 109+7.
Examples
input
2 2
output
5
input
10 1
output
55
input
723 9
output
157557417
题目可以转换成求一个长度为2m的不递减数组,元素取值为1-n;
有两种方法,分别是dp和组合数。
题解一
dp[i][j],i为长度,j为末尾的取值。
dp[i][j]=sigma{dp[i-1][k](1<=k<=j)}=dp[i][j-1]+dp[i-1][j];
题解二
1-n中,每个数可以取多次,总的取得次数为2m,设i取的次数为xi,
则x1+x2+..xm=2m,求该方程解的个数,利用隔板法可得ans=C(n-1+2m,2m)
代码一
#include<bits/stdc++.h>
ll dp[21][1001];
int main()
{
  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  int n,m;
  cin>>n>>m;
  m*=2;
  dp[1][0]=1;
  rep(i,1,m)
     rep(j,1,n){
         dp[i][j]=dp[i][j-1]+dp[i-1][j];dp[i][j]%=mod;
     }
  ll ans=0;
  rep(i,1,n) ans+=dp[m][i],ans%=mod;
  cout<<ans;
  return 0;
}代码二
#include<bits/stdc++.h>
ll dp[21][1001];
int main()
{
  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  int n,m;
  cin>>n>>m;
  m*=2;
  dp[1][0]=1;
  rep(i,1,m)
     rep(j,1,n){
         dp[i][j]=dp[i][j-1]+dp[i-1][j];dp[i][j]%=mod;
     }
  ll ans=0;
  rep(i,1,n) ans+=dp[m][i],ans%=mod;
  cout<<ans;
  return 0;
}