📜  使得A递增,B递减且A [i]≤B [i]的数组对(A,B)的数目

📅  最后修改于: 2021-04-29 18:53:52             🧑  作者: Mango

给定两个整数NM ,任务是找到数组对(A,B)的数量,以使数组AB的大小均为M ,其中AB的每个项都是1N之间的整数。对于1M之间的每个iA [i]≤B [i] 。还给出了数组A非降序排序,而数组B非升序排序。由于答案可能非常大,请以10 9 + 7为模返回答案。

例子:

方法:请注意,如果存在一对有效的数组A和B,并且B在A之后连接,则结果数组将始终是大小为2 * M的升序或非降序数组。(A + B)将在1到N之间(不必使用1到N之间的所有元素)。现在,这可以简单地将给定问题转换为找到大小为2 * M的所有可能组合,其中每个元素在1到N之间(允许重复),其公式为2 * M + N – 1 C N – 1或(2 * M + N – 1)! /((2 * M)!*(N – 1)!)。

下面是上述方法的实现:

CPP
// C++ code of above approach
#include 
#define mod 1000000007
using namespace std;
  
long long fact(long long n)
{
    if(n == 1) 
        return 1;
    else
        return (fact(n - 1) * n) % mod;
}
  
// Function to return the count of pairs
long long countPairs(int m, int n)
{
    long long ans = fact(2 * m + n - 1) / 
                    (fact(n - 1) * fact(2 * m));
    return (ans % mod);
}
  
// Driver code
int main()
{
    int n = 5, m = 3;
    cout << (countPairs(m, n));
    return 0;
}
  
// This code is contributed by mohit kumar 29


Java
// Java code of above approach 
class GFG 
{
    final static long mod = 1000000007 ;
  
    static long fact(long n) 
    { 
        if(n == 1) 
            return 1; 
        else
            return (fact(n - 1) * n) % mod; 
    } 
      
    // Function to return the count of pairs 
    static long countPairs(int m, int n) 
    { 
        long ans = fact(2 * m + n - 1) / 
                   (fact(n - 1) * fact(2 * m)); 
          
        return (ans % mod); 
    } 
      
    // Driver code 
    public static void main (String[] args)
    { 
        int n = 5, m = 3; 
          
        System.out.println(countPairs(m, n)); 
    } 
}
  
// This code is contributed by AnkitRai01


Python3
# Python3 implementation of the approach
from math import factorial as fact
  
# Function to return the count of pairs
def countPairs(m, n):
    ans = fact(2 * m + n-1)//(fact(n-1)*fact(2 * m))
    return (ans %(10**9 + 7))
  
# Driver code
n, m = 5, 3
print(countPairs(m, n))


C#
// C# code of above approach 
using System;
  
class GFG 
{
    static long mod = 1000000007 ;
  
    static long fact(long n) 
    { 
        if(n == 1) 
            return 1; 
        else
            return (fact(n - 1) * n) % mod; 
    } 
      
    // Function to return the count of pairs 
    static long countPairs(int m, int n) 
    { 
        long ans = fact(2 * m + n - 1) / 
                (fact(n - 1) * fact(2 * m)); 
          
        return (ans % mod); 
    } 
      
    // Driver code 
    public static void Main()
    { 
        int n = 5, m = 3; 
          
        Console.WriteLine(countPairs(m, n)); 
    } 
}
  
// This code is contributed by AnkitRai01


输出:
210