BOJ 28242 - 수학 선생님의 고민(Hard)

image.png

일단 판별식을 갈겨서 $b^2-4ac \ge 0$ 이고 제곱수인지 확인한다.

그런다음 근의 공식을 쓰면 $p,q=\dfrac{-b \pm \sqrt{ b^2-4ac }}{2a}$ 가 되는데,

그럼 $nx^2+(n+1)x-(n+2)=n(x-p)(x-q)$ 가 가능한지에 대해 봐야한다.

그럼 $-p$와 $-q$가 정수가 되기위해 곱해져야 할 수를 각각 $p', q'$ 라고 하자.

$p'=\dfrac{2n}{gcd(b-\sqrt{ b^2-4ac }, 2a)}$ 이다.

$p'q' \mid n$ 이라면 답이 있고 그렇지 않다면 답이 없다.

답이 있다면 이제 $n$을 적절히 분배하여 $a, b$에 $p'$ 를 곱해주고 $c,d$에 $\dfrac{n}{p'}$ 를 곱해주면 된다.

void solve() {
   int n;
   cin >> n;
   int a = n, b = n + 1, c = -(n + 2);

   int d = b * b - 4 * a * c;
   if (d < 0) {
      cout << -1;
      return;
   }
   int dd = sqrt(d);
   if (dd * dd != d) {
      cout << -1;
      return;
   }

   int p1 = -b + dd, q1 = -b - dd;
   int g1 = gcd(p1, 2 * a), g2 = gcd(q1, 2 * a);
   p1 /= g1, q1 /= g2;
   int p2 = 2 * a / g1, q2 = 2 * a / g2;
   if (n % (p2 * q2) != 0) {
      cout << -1;
      return;
   }
   int A = p2;
   int B = -p1;
   n /= p2;
   int C = n;
   int D = -q1 * n / q2;

   cout << A << ' ' << B << ' ' << C << ' ' << D;
}

쉬운 풀이

여담으로 이 문제는 $n$이 작아 $\sqrt{ n } \cdot \sqrt{ n+2 }$ 개의 조합으로 $a, b$ 를 결정해주고 풀 수 있다.

왜냐면 $ac=n$ 이고 $bd=-(n+2)$ 이기 때문에 $\text{Min}(a,c) \le \sqrt{ n }$ 처럼 되기 때문이다.

$nx^2+(n+1)x-(n+2)=(ax+b)(cx+d)$ 에서

$a, b$를 결정해준다면 $c=n/a, d=-(n+2)/b$ 가 된다.

이때, $b,d$ 의 부호가 다르게 되는 두 가지 경우를 검사해준다.

Tags:

Categories:

Updated:

Comments