C++でGCDが1となる部分列の個数を数える方法
整数型の要素からなる配列が与えられ、その中からGCD(最大公約数)が1となる部分列を見つけ出し、その個数を求めるのが今回の課題です。GCD(最大公約数)とは、2つ以上の整数をすべて余りなく割り切ることができる整数のうち、最も大きいものを指します。
入力例と出力例
入力 − int arr[] = {3, 4, 8, 16}
出力 − GCDが1となる部分列の個数 − 7
説明 −
与えられた配列から作成できる、GCDが1となる部分列は (3, 4)、(3, 8)、(3, 16)、(4, 3)、(8, 3)、(16, 3)、(3, 4, 8) の7つです。
入力 − int arr[] = {5, 7, 10}
出力 − GCDが1となる部分列の個数 − 3
説明 −
与えられた配列から作成できる、GCDが1となる部分列は (5, 7)、(7, 10)、(5, 7, 10) の3つです。
プログラムで使用しているアプローチ
任意のサイズの整数型配列を入力として受け取ります。
配列のサイズを計算し、以降の処理のためにデータを関数へ渡します。
GCDが1となる部分列の個数を格納するための一時変数 count を宣言します。
i を 0 から配列のサイズまで動かす FOR ループを開始します。
そのループの中で、j を 0 から配列のサイズまで動かす別の FOR ループを開始します。
ループ内で IF 文により GCD(arr[i], arr[j]) == 1 であるかどうかを判定し、真であれば count を 1 増やします。
count を返します。
結果を出力します。
サンプルコード
このコードでは、ユークリッドの互除法を再帰的に利用して2つの整数の最大公約数を求める gcd 関数を定義しています。そして GCD_1 関数の中で二重ループによって配列内の要素同士の組み合わせをすべて調べ、GCDが1になる組み合わせをカウントしていきます。
# include <bits/stdc++.h>
using namespace std;
int gcd(int a, int b){
if (a == 0)
return b;
return gcd(b % a, a);
}
int GCD_1(int arr[],int size){
int count = 0;
for(int i=0;i<size;i++){
for(int j=0;j<=size;j++){
if(gcd(arr[i],arr[j])==1){
count++;
}
}
}
return count;
}
int main(){
int arr[] = {3, 4, 8, 16};
int size = sizeof(arr)/sizeof(arr[0]);
cout<<"Count of number of sub-sequences with GCD 1 are: "<<GCD_1(arr, size);
return 0;
}
出力
上記のコードを実行すると、次のような出力が得られます −
Count of number of sub-sequences with GCD 1 are: 7
-
C++でk個の奇数を含む「良い部分配列」の個数を数える方法
整数型の配列 nums と整数 k が与えられます。部分配列に含まれる奇数の個数がちょうど k 個であるとき、その部分配列を「良い部分配列(nice subarray)」と呼びます。この記事では、条件を満たす良い部分配列の個数を求めるアルゴリズムを解説します。 例として、配列が [1,1,2,1,1]、k = 3 の場合を考えてみましょう。このとき出力は 2 になります。条件を満たす部分配列は [1,1,2,1] と [1,2,1,1] の2つだからです。 解法の考え方 まず、配列中に現れる奇数のインデックスをすべて記録した配列 odd を作成します。次に、連続する k 個の奇数からなるウィン
-
C++で整数の完全平方約数をすべて数える方法
このチュートリアルでは、C++ を使って「ある整数の約数のうち、完全平方数であるもの(完全平方約数)」の個数を求めるプログラムを解説します。 ここでいう完全平方約数とは、与えられた数 n の約数の中で、1, 4, 9, 16 のようにある整数の 2 乗として表せる数のことを指します。 アプローチ 以下の手順で問題を解きます。 i を 1 から √n まで順に調べ、n が i で割り切れるかどうかを確認します。 n が i で割り切れる場合、i 自身が完全平方数であればカウントを 1 増やします。 同時に、ペアとなる約数 n / i も確認し、これが完全平方数であれば(i ≠ n/i の場合の