여기에서 우리는 모듈식 방정식과 관련된 한 가지 흥미로운 문제를 볼 것입니다. 두 개의 값 A와 B가 있다고 가정합니다. (A mod X) =B가 유지되도록 변수 X가 취할 수 있는 가능한 값의 수를 찾아야 합니다.
A가 26이고 B가 2라고 가정합니다. 따라서 X에 대한 기본 값은 {3, 4, 6, 8, 12, 24}이므로 개수는 6이 됩니다. 이것이 답입니다. 더 나은 아이디어를 얻기 위해 알고리즘을 살펴보겠습니다.
알고리즘
possibleWayCount(a, b) -
begin if a = b, then there are infinite solutions if a < b, then there are no solutions otherwise div_count := find_div(a, b) return div_count end
find_div(a, b) -
begin n := a – b div_count := 0 for i in range 1 to square root of n, do if n mode i is 0, then if i > b, then increase div_count by 1 end if if n / i is not same as i and (n / i) > b, then increase div_count by 1 end if end if done end
예시
#include <iostream> #include <cmath> using namespace std; int findDivisors(int A, int B) { int N = (A - B); int div_count = 0; for (int i = 1; i <= sqrt(N); i++) { if ((N % i) == 0) { if (i > B) div_count++; if ((N / i) != i && (N / i) > B) //ignore if it is already counted div_count++; } } return div_count; } int possibleWayCount(int A, int B) { if (A == B) //if they are same, there are infinity solutions return -1; if (A < B) //if A < B, then there are two possible solutions return 0; int div_count = 0; div_count = findDivisors(A, B); return div_count; } void possibleWay(int A, int B) { int sol = possibleWayCount(A, B); if (sol == -1) cout << "For A: " << A << " and B: " << B << ", X can take infinite values greater than " << A; else cout << "For A: " << A << " and B: " << B << ", X can take " << sol << " values"; } int main() { int A = 26, B = 2; possibleWay(A, B); }
출력
For A: 26 and B: 2, X can take 6 values