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

image.png

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

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

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

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

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

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

답이 있다면 이제 nn을 적절히 분배하여 a,ba, bpp' 를 곱해주고 c,dc,dnp\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;
}

쉬운 풀이Permalink

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

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

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

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

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

Tags:

Categories:

Updated:

Comments