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

C++で最初のN個の自然数から合計がKで割り切れるペアの個数を求める

NとKという2つの整数が与えられたとき、最初のN個の自然数の中から選んだペアのうち、その合計がKで割り切れるものの個数を求めます。まずは具体例を見てみましょう。

入力例

N = 3
K = 2

出力例

1

この場合、合計がK(=2)で割り切れるペアは1つだけです。該当するペアは (1, 3) です。

アルゴリズム

この問題は、以下の手順で解くことができます。

  • NとKを初期化します。
  • 1からNまでの自然数を生成し、配列に格納します。
  • カウント用の変数を0で初期化します。
  • 二重ループを使って、配列内のすべてのペアを列挙します。
    • 各ペアの合計値を計算します。
    • 合計値がKで割り切れる場合は、カウントを1増やします。
  • 最後にカウントを返します。

C++による実装

以下は、上記のアルゴリズムをC++で実装したサンプルコードです。

#include <bits/stdc++.h>
using namespace std;

int countPairs(vector<int> arr, int N, int K) {
    int count = 0;
    for (int i = 0; i < N; i++) {
        for (int j = i + 1; j < N; j++) {
            int sum = arr[i] + arr[j];
            if (sum % K == 0) {
                count++;
            }
        }
    }
    return count;
}

int main() {
    vector<int> arr;
    int N = 10, K = 5;
    for (int i = 1; i <= N; i++) {
        arr.push_back(i);
    }
    cout << countPairs(arr, N, K) << endl;
    return 0;
}

実行結果

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

9

この例では、N = 10、K = 5 のとき、合計が5で割り切れるペアは9組存在することが確認できます。

計算量について

このアプローチでは、すべてのペアを総当たりで調べるため、時間計算量は O(N²) となります。Nが大きいケースでは、各数値をKで割った余りの分布に着目することで、O(N + K) のより効率的な解法へと改善することも可能です。

  1. C++で最初のn個の自然数の総和の合計を求める方法

    問題の概要本記事では、「最初のn個の自然数の総和の合計」を求める問題を扱います。具体的には、1からnまでの各自然数kについて「1からkまでの合計」を計算し、それらをすべて足し合わせた最終的な値を求めます。まず、具体例を見ながら概念を理解しましょう。入力 : 4 出力 : 20 説明 : 最初の1個の自然数の合計 = 1 最初の2個の自然数の合計 = 1 + 2 = 3 最初の3個の自然数の合計 = 1 + 2 + 3 = 6 最初の4個の自然数の合計 = 1 + 2 + 3 + 4 = 10 したがって、総和の合計 = 1 + 3 + 6 + 10 = 20このように、各段階の部分和(1, 3

  2. 【Python】最初のN個の自然数から合計がkで割り切れるペアの数を求めるプログラム

    問題の概要 数 n と値 k が与えられ、最初の N 個の自然数(1, 2, ..., n)を要素とする配列 A があるとします。このとき、i < j を満たす要素 A[i] と A[j] のペアのうち、その合計が k で割り切れるものの総数を求めるのが課題です。 例えば、入力が n = 10、k = 4 の場合、合計が 4 で割り切れるペアは次の 10 個存在するため、出力は 10 となります。 [(1,3), (1,7), (2,6), (2,10), (3,5), (3,9), (4,8), (5,7), (6,10), (7,9)] 解法のアプローチ この問題は、全ペアを素朴に