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