Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 서로 다른 두 세트에서 하나 이상의 쌍을 선택하는 방법

<시간/>

이 문제에서 두 개의 양수 n과 m(n <=m)이 주어집니다. 이는 각각 두 세트의 총 항목 수입니다. 우리의 임무는 이러한 세트의 항목에서 쌍(하나 이상)을 선택하는 총 방법의 수를 찾는 것입니다.

문제를 이해하기 위해 예를 들어보겠습니다.

입력

2 2

출력

6

설명

두 개의 요소가 있는 두 개의 세트가 있습니다.

Set A = {1, 2}
Set B = {3, 4}

한 번에 한 쌍씩 배열하는 방법,(1..3), (1...4), (2..3), (2...4)

한 번에 두 쌍을 배열하는 방법,(1...3, 2...4) , (1...4, 2...3)

이 문제를 해결하기 위해 집합의 요소 조합을 사용합니다. 다음은 개수를 구할 수 있는 간단한 조합 공식입니다.

Ways = Σn i=1n Ci* mCi* i!
= Σni=1 ( nPi * mPi) /i

솔루션 구현을 보여주는 프로그램,

예시

#include <iostream>
using namespace std;
int* fact, *inverseMod;
const int mod = 1e9 + 7;
int power(int x, int y, int p){
   int res = 1;
   x = x % p;
   while (y) {
      if (y & 1)
         res = (1LL * res * x) % p;
      y = y >> 1;
      x = (1LL * x * x) % p;
   }
   return res;
}
void calculate(int n){
   fact[0] = inverseMod[0] = 1;
   for (int i = 1; i <= n; ++i) {
      fact[i] = (1LL * fact[i - 1] * i) % mod;
      inverseMod[i] = power(fact[i], mod - 2, mod);
   }
}
int nPr(int a, int b) {
   return (1LL * fact[a] * inverseMod[a - b]) % mod;
}
int selectPairCount(int n, int m){
   fact = new int[m + 1];
   inverseMod = new int[m + 1];
   calculate(m);
   int ans = 0;
   for (int i = 1; i <= n; ++i) {
      ans += (1LL * ((1LL * nPr(n, i)
      * nPr(m, i)) % mod)
      * inverseMod[i]) % mod;
      if (ans >= mod)
      ans %= mod;
   }
   return ans;
}
int main() {
   int n = 2, m = 2;
   cout<<"The number of ways to select pairs is : "<<selectPairCount(n, m);
   return 0;
}

출력

The number of ways to select pairs is : 6