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

C++でA % X = BとなるXの取り得るすべての値の個数を求める

問題概要

2つの整数AとBが与えられ、「A % X = B」を満たすような整数Xの取り得る値の個数を求めるのが目標です。この条件式については、AとBの大小関係によって次のように場合分けができます。

  • A == B の場合:Xは無限に多くの値を取り得るため、-1を返します。
  • A < B の場合:解が1つも存在しないため、0を返します。
  • A > B の場合:(A − B) の約数のうちBより大きいものの個数を結果として返します。

考え方のポイント

剰余演算の性質上、「余りは必ず割る数よりも小さくなる」ため、A % X = B が成り立つには X > B であることが必要です。また、A % X = B が成り立つとき、A は A = q × X + B(qは整数)の形で表せるため、(A − B) がXで割り切れることも必要です。したがって、求めるべきXの候補は「(A − B) の約数のうちBより大きいもの」ということになります。

入出力例

例1

入力:

A=5, B=2

出力:

A % X = B となるXのすべての可能な値の個数:1

説明:

5 % 3 = 2 なので、このときのXは3です。

例2

入力:

A=10, B=10

出力:

A % X = B となるXのすべての可能な値の個数:-1

説明:

A == B なので解は無限に存在し、-1が返されます。

アルゴリズム・アプローチ

このアプローチでは、forループを i = 1 から i * i <= (A − B) の範囲で回しながら (A − B) の約数を求めます。i が (A − B) を割り切る場合は、count を適宜更新していきます。手順は以下のとおりです。

  • 整数AとBを入力として受け取ります。
  • A < B の場合は、結果として0を出力します。
  • A == B の場合は、結果として-1を出力します。
  • A > B の場合は、関数 possible_values(int A, int B) がAとBを受け取り、A % X = B を満たすXのすべての可能な値の個数を返します。
  • count の初期値を0、X = A − B とします。
  • i = 1 から i * i <= (A − B) までforループで走査し、Xの約数を調べます。
  • i がXを割り切る場合、temp = i、temp_2 = B − 1 とし、i * i != X であれば temp_2 = X / i とします。
  • temp > B であれば count をインクリメントし、同様に temp_2 > B であっても count をインクリメントします。
  • ループ終了後、count を結果として返します。

実装例(C++)

#include <bits/stdc++.h>
using namespace std;
int possible_values(int A, int B){
    int count = 0;
    int X = A - B;
    for (int i = 1; i * i <= A - B; i++){
        if(X % i == 0){
            int temp = i;
            int temp_2 = B - 1;
            if(i * i != X){
                temp_2 = X / i;
            }
            if(temp > B){
                count++;
            }
            if(temp_2 > B){
                count++;
            }
        }
    }
    return count;
}
int main(){
    int A = 15, B = 5;
    if(A < B){
        cout<<"Count of all possible values of X such that A % X = B are: "<<0;
    }
    else if(A == B){
        cout<<"Count of all possible values of X such that A % X = B are: "<<-1;
    }
    else{
        cout<<"Count of all possible values of X such that A % X = B are: "<<possible_values(A, B);
    }
    return 0;
}

出力

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

Count of all possible values of X such that A % X = B are: 1

計算量

  • 時間計算量:O(√(A − B)) — 約数の探索を√(A − B) までの範囲で行うためです。
  • 空間計算量:O(1) — 追加のデータ構造は使用しません。
  1. C++で (x % k) × (x / k) == n を満たす最小の x を求める方法

    2つの正の整数 n と k が与えられたとき、(x % k) × (x / k) が n と等しくなるような正の整数 x を求める必要があります。例えば n = 4、k = 6 の場合、答えは 10 になります。実際に確認すると、(10 % 6) × (10 / 6) = 4 × 1 = 4 となり、条件を満たしています。解法のアプローチここでポイントになるのは、x % k の値が必ず 1 以上 k − 1 以下の範囲に収まるという点です(0 は除外します。x % k が 0 になると積も 0 になり、正の整数 n とは一致しないためです)。そこで、n の約数のうち [1, k − 1] の範

  2. C++で配列内の a % b = k を満たすすべてのペア(a, b)を検索する方法

    問題の概要配列 A が与えられたとき、その中から a % b = k を満たすすべてのペア(a, b)を見つけることを考えます。たとえば、配列 A = [2, 3, 4, 5, 7]、k = 3 の場合、条件を満たすペアは (7, 4)、(3, 4)、(3, 5)、(3, 7) となります。ここで注意したいのは、(a, b) が順序付きペアであるという点です。つまり (3, 4) と (4, 3) は別々の候補として扱われ、それぞれ剰余演算の結果が k と一致するかどうかが個別に判定されます。解法のアプローチこの問題は、ブルートフォース(総当たり)法によって解くことができます。手順は以下のとお