C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で2つの異なるセットから1つ以上のペアを選択する方法


この問題では、2つの正の数nとm(n <=m)が与えられます。これは、それぞれ2つのセットのアイテムの総数です。私たちの仕事は、これらのセットのアイテムからペア(1つ以上)を選択する方法の総数を見つけることです。

問題を理解するために例を見てみましょう

入力

2 2

出力

6

説明

2つの要素を持つ2つのセットがあります

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

一度に1つのペアを配置する方法、(1..3)、(1 ... 4)、(2..3)、(2 ... 4)

一度に2つのペアを配置する方法、(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

  1. C++のソースからkを超える長さのパスがあるかどうかを確認します

    コンセプト 与えられたグラフ、グラフ内のソース頂点、および数値k(ここでkは、ソース頂点と宛先頂点の間のグラフのパス長を示します)に関して、私たちのタスクは、開始する単純なパス(サイクルなし)があるかどうかを判断することです。指定されたソースから、他の頂点(つまり宛先)で終了します。グラフを以下に示します- 入力 Source s = 0, k = 64 出力 True 4があり、合計距離は68 kmで、64を超えています。 入力 Source s = 0, k = 70 出力 False 8)であるため、69を超える入力の場合は出力がfalseになります。 メソッド 重要なこ

  2. 2つ以上(または配列)の数値のGCD0のC++プログラム?

    ここでは、3つ以上の数値の公約数を取得する方法を説明します。 2つの数値の公約数を見つけるのは簡単です。 3つ以上の数値のgcdを見つけたい場合は、gcdの結合法則に従う必要があります。たとえば、{w、x、y、z}のgcdを検索する場合は、{gcd(w、x)、y、z}、次に{gcd(gcd(w、x)、y)になります。 、z}、最後に{gcd(gcd(gcd(w、x)、y)、z)}。アレイを使用すると、非常に簡単に実行できます。 アルゴリズム gcd(a、b) begin    if a is 0, then       return b &n