📜  N 个元素可以形成两个不同集合的方式计数,每个集合包含 N/2 个元素

📅  最后修改于: 2022-05-13 01:56:05.894000             🧑  作者: Mango

N 个元素可以形成两个不同集合的方式计数,每个集合包含 N/2 个元素

给定一个数字N ,表示元素的数量并且等于2K ,任务是找到这些元素可以形成 2 个集合的方式的数量,每个集合包含K个元素。

例子:

方法:要注意的是,必须应用组合的概念才能为每个集合选择元素。
已知从总共n 个事物中选择r个事物的方法数由下式给出:

现在,可以修改上面的公式来解决给定的问题:

  • 在这里,必须从N个元素中选择N/2 个元素来形成每个集合。因此, r = N/2
  • 需要注意的是,同一元素不能同时存在于两个集合中。所以, n C r的公式 必须除以 2。
  • 此外,每个集合中存在的元素可以排列成(N / 2-1)!方法。由于有两组,公式将乘以该因子两次。

得到的修正公式由下式给出:

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
 
// Function to find the factorial
// of values
long long int fact(long long int N)
{
    // Factorial of 0 is 1
    if (N == 0) {
        return 1;
    }
    else {
 
        // Recursive function call
        return N * fact(N - 1);
    }
}
 
// Driver Code
int main()
{
 
    // Given input
    int N = 20;
 
    // Function Call
    cout << (fact(N) / (fact(N / 2)
                        * fact(N - N / 2)))
                / 2
                * fact(N / 2 - 1)
                * fact(N / 2 - 1);
 
    return 0;
}


Java
// Java code for the above approach
import java.io.*;
class GFG
{
   
    // Function to find the factorial
    // of values
    static long fact(long N)
    {
       
        // Factorial of 0 is 1
        if (N == 0) {
            return 1;
        }
        else {
 
            // Recursive function call
            return N * fact(N - 1);
        }
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        // Given input
        int N = 20;
 
        // Function Call
        System.out.println(
            (fact(N) / (fact(N / 2) * fact(N - N / 2))) / 2
            * fact(N / 2 - 1) * fact(N / 2 - 1));
    }
}
 
// This code is contributed by Potta Lokesh


Python3
# python program for the above approach
 
# Function to find the factorial
# of values
def fact(N):
 
    # Factorial of 0 is 1
    if (N == 0):
        return 1
 
    else:
 
        # Recursive function call
        return N * fact(N - 1)
 
# Driver Code
if __name__ == "__main__":
 
    # Given input
    N = 20
 
    # Function Call
    print(int((fact(N) / (fact(N / 2) * fact(N - N / 2))) /
              2 * fact(N / 2 - 1) * fact(N / 2 - 1)))
 
# This code is contributed by rakeshsahni


C#
// C# code for the above approach
using System;
public class GFG
{
   
    // Function to find the factorial
    // of values
    static long fact(long N)
    {
       
        // Factorial of 0 is 1
        if (N == 0) {
            return 1;
        }
        else {
 
            // Recursive function call
            return N * fact(N - 1);
        }
    }
 
    // Driver Code
    public static void Main(string[] args)
    {
        // Given input
        int N = 20;
 
        // Function Call
        Console.WriteLine(
            (fact(N) / (fact(N / 2) * fact(N - N / 2))) / 2
            * fact(N / 2 - 1) * fact(N / 2 - 1));
    }
}
 
// This code is contributed AnkThon


Javascript


输出
12164510040883200

时间复杂度: O(N)
辅助空间: O(N)