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) のより効率的な解法へと改善することも可能です。
-
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
-
【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)] 解法のアプローチ この問題は、全ペアを素朴に