아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

역공학

시간 제한1초메모리 제한128 MB

요약
주어진 프로그램이 최대공약수를 계산함을 파악하고 각 목표값이 나오도록 입력 쌍을 구합니다.
난이도

보통10점 중 6점

유형
정수론, 수학
정답자
아직 제출이 없습니다

문제

경찰이 무정부주의 단체 MCA와 MBI가 주고받던 소스 코드 조각을 최근 가로챘다. 그 조각은 아래와 같다. 무정부주의자는 원칙적으로 C만 쓰기 때문에 원본은 C이고, 읽기 편하도록 Pascal로 옮긴 것도 함께 싣는다.

int main()
{ int u,v,k,t ;
  scanf("%d %d",&u,&v) ;
  for (k=0;!(u%2)&&!(v%2);k++)
    { u/=2 ; v/=2 ; }
  if (u%2) t=-v ; 
  else t=u/2 ;
  while(t) {
    while(!(t%2)) t/=2 ;
    if (t>0) u=t ; else v=-t ;
    t=u-v ; 
  }
  while(k-->0) u*=2 ; 
  printf("%d\n",u) ;
  return 0 ;
}
program zahada;
var u,v,k,t:integer;
begin
  readln(u,v); k:=0;
  while(u mod 2=0)and(v mod 2=0) do
    begin u:=u div 2; v:=v div 2; k:=k+1; end;
  if(u mod 2<>0) then t:=-v
  else t:=u div 2;
  while(t<>0) do begin
    while(t mod 2=0) do t:=t div 2;
    if(t>0) then u:=t else v:=-t;
    t:=u-v;
  end;
  while(k>0) do begin u:=u*2; k:=k-1; end;
  writeln(u:1);
end.

이 프로그램이 입력에서 두 수를 읽어 어떤 결과를 계산한다는 점은 한눈에 보인다. 그러나 계산 과정의 속내는 아직 밝혀내지 못했고, 그래서 입력과 출력이 어떻게 이어지는지 정확히 모른다. 편의상 이 프로그램이 구현하는 함수를 ff라고 부르자. 정의역은 양의 정수 집합이다. 정수 aa와 bb를 프로그램 입력으로 주었을 때 프로그램이 출력하는 값이 f(a,b)f(a, b)이다. 프로그램이 끝나지 않거나 오류로 끝나면 그 입력에 대한 f(a,b)f(a, b)는 정의되지 않는다. 함수의 동작을 더 자세히 살피려면 역함수가 필요하다. 즉 f(a,b)f(a, b)가 미리 정해진 값과 같아지는 두 수 aa와 bb를 찾아야 한다.

입력

첫 줄에 양의 정수 ZZ가 주어지고, 그 뒤로 ZZ개의 지시가 차례로 이어진다. 각 지시는 한 줄이고, 공백으로 구분된 두 정수 NN과 MM으로 이루어진다. 0<N,M≤10000000 < N, M \le 1000000이다.

출력

각 지시마다 한 줄에 두 수 UU와 VV를 공백으로 구분해 출력한다. 두 수는 f(U,V)=Mf(U, V) = M과 1≤V<U<N1 \le V < U < N을 모두 만족해야 한다. 조건을 만족하는 쌍이 여럿이면 UU가 최대인 쌍을 출력한다. 최대인 UU가 같은 해가 여럿이면 그중 VV가 최대인 것을 출력한다. 조건을 만족하는 쌍이 하나도 없으면 그 줄에 Reseni neexistuje.를 출력한다.

예제2

  1. 예제 1

    입력
    2
    11 2
    2 10
    
    예상 출력
    10 8
    Reseni neexistuje.
    
  2. 예제 2

    입력
    3
    100 7
    100 50
    100 99
    
    예상 출력
    98 91
    Reseni neexistuje.
    Reseni neexistuje.