조니는 이제 막 이차방정식을 배웠다. 열정 넘치는 프로그래머인 그는 숙제에 도움이 될 것 같아 곧바로 다음 프로그램을 작성했다.
#include<cstdio>
int main() {
unsigned int a,b,c,x=0;
scanf("%u %u %u",&a,&b,&c);
do {
if (a*x*x+b*x+c==0) {
puts("YES");
return 0;
}
x++;
} while(x);
puts("NO");
return 0;
}
모든 계산은 부호 없는 32비트 정수로, 즉 232으로 나눈 나머지 위에서 이루어진다. 이 프로그램은 x를 0부터 부호 없는 32비트 정수 전체에 대해 차례로 시도하면서 a⋅x2+b⋅x+c≡0(mod232)를 만족하는 x를 찾는 즉시 YES를 출력하고, 그런 x가 하나도 없으면 NO를 출력한다. 하지만 이 완전 탐색 방식은 최신 게임용 컴퓨터에서도 너무 느리다. 같은 출력을 빠르게 만들어 낼 수 있을까?
첫째 줄에 테스트 케이스의 개수를 나타내는 정수 t (t≤104)가 주어진다. 이어지는 t개의 줄에는 각각 공백으로 구분된 세 정수 a, b, c (0≤a,b,c<232)가 주어진다.
각 테스트 케이스마다 a⋅x2+b⋅x+c≡0(mod232)를 만족하는 부호 없는 32비트 정수 x가 존재하면 YES를, 존재하지 않으면 NO를 입력에 주어진 순서대로 한 줄에 하나씩 출력한다.