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

【C++】1からaと1からbのペアのうち、合計がNで割り切れる組の数を数える方法

整数 a、b、n が与えられます。ここで x は 1 以上 a 以下の整数、y は 1 以上 b 以下の整数とし、これらを組み合わせて作られるすべてのペア (x, y) のうち、合計値 (x + y) が n で割り切れるペアの総数を求めるのが今回の課題です。

入出力の例

例1

入力: int a = 2, b = 3, n = 2

出力: 合計がNで割り切れるペアの数 ― 3

説明:

まず、1 から a(=2)までの整数は「1, 2」です。
次に、1 から b(=3)までの整数は「1, 2, 3」です。
作成できるペアは (1,1)、(1,2)、(1,3)、(2,1)、(2,2)、(2,3) の6通りで、
それぞれの合計は 2、3、4、3、4、5 となります。
このうち n(=2)で割り切れるのは 2、4、4 の3つなので、答えは 3 です。

例2

入力: int a = 4, b = 3, n = 3

出力: 合計がNで割り切れるペアの数 ― 4

説明:

1 から a(=4)までの整数は「1, 2, 3, 4」、1 から b(=3)までの整数は「1, 2, 3」です。
作成できるペアは全部で12通りあり、それぞれの合計は 2、3、4、3、4、5、4、5、6、5、6、7 です。
このうち n(=3)で割り切れるのは 3、3、6、6 の4つなので、答えは 4 です。

プログラムで使用するアプローチ

  • 1〜a、1〜b の範囲と割る数として、整数変数 a、b、n を入力として受け取る
  • 後続の処理のため、すべての値を関数に渡す
  • ペアの個数を保持する一時変数 count を用意する
  • i を 1 から a まで繰り返す外側の for ループを開始する
  • その内側で、j を 1 から b まで繰り返す for ループを開始する
  • ループ内で sum に i + j を代入する
  • sum % n == 0 が成立するかどうかを判定し、成立していれば count を 1 増やす
  • count を返す
  • 結果を出力する

C++実装例

#include <iostream>
using namespace std;

int Pair_a_b(int a, int b, int n){
    int count = 0;
    for (int i = 1; i <= a; i++){
        for (int j = 1; j <= b; j++){
            int temp = i + j;
            if (temp % n == 0){
                count++;
            }
        }
    }
    return count;
}

int main(){
    int a = 2, b = 20, n = 4;
    cout<<"1からaと1からbまでのペアのうち、合計がNで割り切れる組の数: "<<Pair_a_b(a, b, n);
    return 0;
}

出力結果

上記のコードを実行すると、以下の出力が得られます。

1からaと1からbまでのペアのうち、合計がNで割り切れる組の数: 10

計算量に関する補足

この手法はすべてのペア (i, j) を二重ループで確認するため、時間計算量は O(a × b) となります。a と b が小さい範囲では十分に実用的ですが、値が大きくなる場合は、各数を n で割った余りの分布(剰余の出現回数)を事前に集計して組み合わせを数えることで、線形時間での効率化も可能です。

  1. C++で合計が素数かつn未満となるペアの個数を数える方法

    正の整数 n が入力として与えられます。この記事の目的は、合計 (i + j) が素数であり、かつ n 未満となるペア (i, j) の個数を求めることです。ここで、i ≠ j かつ i, j ≥ 1 という条件を満たす必要があります。例として、n が 4 の場合を考えてみましょう。このとき条件を満たすペアは (1, 2) の 1 つだけです。1 + 2 = 3 は素数であり、4 未満だからです。また、1 と 2 はどちらも 1 以上の条件を満たしています。それでは、具体例を使って理解を深めましょう。入力 − n = 7出力 − 合計が素数かつ n 未満となるペアの数 − 3説明 − 該当する

  2. C++で2つのBSTから合計が指定値xと等しいペアを数える方法

    2つの二分探索木(BST)と整数値 x が与えられます。この記事の目的は、BST_1 から1つのノード、BST_2 からもう1つのノードを選んだペアのうち、両ノードの値の合計が x に一致するものの個数を求めることです。具体的には、BST_1 のノードと BST_2 のノードのデータ部分を加算し、その合計が x と等しければカウントを1つ増やしていきます。具体例で確認してみましょう。入力出力 − 合計が指定値 x に等しい2つのBSTからのペアの数 − 1説明 − 該当するペアは (8, 6) です。入力出力 − 合計が指定値 x に等しい2つのBSTからのペアの数 − 2説明 − 該当するペ