在 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

更新于:17-Jul-2020

126 观看

开启你的 事业

完成课程后获得认证

开始
广告
© . All rights reserved.