/*
TASK:crazy
LANG:C
*/

#include <stdio.h>
#include "module.h"

#define MAXN 511

int kind[MAXN][MAXN]; // 0 - n/a, 1 - win, 2 - lose
int next[MAXN][MAXN][2];
int q[MAXN*MAXN][2];
int q_sz,q_pos;
int is_prime[MAXN];
int nasl[MAXN][MAXN];
int nasl_sz[MAXN];
int back_nasl[MAXN][MAXN];
int back_nasl_sz[MAXN];
int br_nasl[MAXN][MAXN];
int win_nasl[MAXN][MAXN];
int visited[MAXN][MAXN];

int NOD(int a,int b)
  {
    if (a < b) return NOD(b,a);
    if (b == 0) return a;
    return NOD(b,a % b);
  }

int prime(int num)
  {
    int i;

    for (i = 2;i*i <= num;i++)
      if (num % i == 0) return 0;

    return 1;
  }

void FindNaslBr(int a,int b)
  {
     br_nasl[a][b] = back_nasl_sz[a] + back_nasl_sz[b];
  }

void BFS()
  {
    int a,b,i;

    while (q_pos < q_sz)
      {
        a = q[q_pos][0];
        b = q[q_pos][1];
        if (a == 4 && b == 2)
          printf("");
        visited[a][b] = 1;
        q_pos++;

        // First kind
        for (i = 0;i < nasl_sz[a] && b > 2;i++)
          if (kind[a][b] == 2)
            {
              if (kind[nasl[a][i]][b - 1] == 0)
                {
                  kind[nasl[a][i]][b - 1] = 1;
                  next[nasl[a][i]][b - 1][0] = a;
                  next[nasl[a][i]][b - 1][1] = b;
                  q[q_sz][0] = nasl[a][i];
                  q[q_sz][1] = b - 1;
                  q_sz++;
                }
            }
          else
            {
              win_nasl[nasl[a][i]][b - 1]++;
              if (win_nasl[nasl[a][i]][b - 1] == br_nasl[nasl[a][i]][b - 1] && kind[nasl[a][i]][b - 1] == 0)
                {
                  kind[nasl[a][i]][b - 1] = 2;
                  q[q_sz][0] = nasl[a][i];
                  q[q_sz][1] = b - 1;
                  q_sz++;
                }
            }
            
        // Second kind
        for (i = 0;i < nasl_sz[b] && a > 2;i++)
          if (kind[a][b] == 2)
            {
              if (kind[a - 1][nasl[b][i]] == 0)
                {
                  kind[a - 1][nasl[b][i]] = 1;
                  next[a - 1][nasl[b][i]][0] = a;
                  next[a - 1][nasl[b][i]][1] = b;
                  q[q_sz][0] = a - 1;
                  q[q_sz][1] = nasl[b][i];
                  q_sz++;
                }
            }
          else
            {
              win_nasl[a - 1][nasl[b][i]]++;
              if (win_nasl[a - 1][nasl[b][i]] == br_nasl[a - 1][nasl[b][i]] && kind[a - 1][nasl[b][i]] == 0)
                {
                  kind[a - 1][nasl[b][i]] = 2;
                  q[q_sz][0] = a - 1;
                  q[q_sz][1] = nasl[b][i];
                  q_sz++;
                }
            }            
      }
  }

void Preprocess()
  {
    int i,j;

    // Find prime
    for (i = 2;i < MAXN;i++) is_prime[i] = prime(i);

    // Find next nums
    for (i = 2;i < MAXN;i++)
      {
        for (j = i + 1;j < MAXN;j++)
          if (NOD(i,j) != 1)
            {
              nasl[i][nasl_sz[i]++] = j;
              back_nasl[j][back_nasl_sz[j]++] = i;
            }
      }


    // Find number of nasl
    for (i = 2;i < MAXN;i++)
      for (j = 2;j < MAXN;j++)
         FindNaslBr(i,j);
    
    
    for (i = 2;i < MAXN;i++)
      for (j = 2;j < MAXN;j++)
          if (is_prime[i] && is_prime[j])
            {
              kind[i][j] = 2;
              q[q_sz][0] = i;
              q[q_sz][1] = j;
              q_sz++;
            }

    BFS();

/*    for (i = 2;i < MAXN;i++)
      for (j = 2;j < MAXN;j++)
        if (!visited[i][j])

          printf("%d %d\n",i,j);*/
  }

int main()
  {
    long x, y, a, b;

    Preprocess();

    while (1)
      {
        getnum(&x, &y);
        printf("Numbers: %d %d\n", x, y);
        a = next[x][y][0];
        b = next[x][y][1];
        setnum(a, b);
      }

  return 0;
}
