#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<queue>

using namespace std;
using ll = long long;
using vi = vector<int>;
using vvi = vector<vector<int> >;
using pii = pair<int, int>;
using ppi = pair<pii, int>;

int f_dir[2][4] = {{-1, 0, 1, 0}, {0, 1, 0, -1}}; //↑→↓←
int e_dir[2][8] = {{-1, -1, -1, 0, 0, 1, 1, 1}, {-1, 0, 1, -1, 1, -1, 0, 1}};
bool is_in_field(int y, int x, int h, int w){
  return (y >= 0 && y < h && x >= 0 && x < w);
}
vvi caves(1500, vi(1500, -1));
vi is_p(1000001, 1);
vector<pii> inv(1000001, pii(-1, -1));
vvi dp;

int main(){
  cin.tie(0);
  ios::sync_with_stdio(false);
  int ti = clock();
  // start-----------------------------------------------
  is_p[1] = 0;
  for(int i = 2; i <= 1000000; i++){
    int j = 2;
    while(i * j <= 1000000){
      is_p[i*j] = 0;
      j++;
    }
  }
  int y = 750, x = 750, dir = 2;
  for(int i = 1; i <= 1000000; i++){
    caves[y][x] = i;
    inv[i] = {y, x};
    if(caves[y+f_dir[0][(4+dir-1)%4]][x+f_dir[1][(4+dir-1)%4]] == -1){
      dir = (4+dir-1) % 4;
    }
    y += f_dir[0][dir];
    x += f_dir[1][dir];
  }

  int m, n;
  while(cin >> m >> n, m){
    dp = vvi(1500, vi(1500, -1));
    pii st = inv[n];
    pii ans = {0, 0};
    dp[st.first][st.second] = 0;
    for(int i = st.first; i < 1500; i++){
      for(int j = 0; j < 1500; j++){
        if(caves[i][j] > m || caves[i][j] == -1 || dp[i][j] == -1) continue;
        if(is_p[caves[i][j]]){
          dp[i][j]++;
          if(dp[i][j] > ans.first || (dp[i][j] == ans.first && caves[i][j] > ans.second)){
            ans = {dp[i][j], caves[i][j]};
          }
        }
        for(int k = -1; k <= 1; k++){
          if(!is_in_field(i+1, j+k, 1500, 1500)) continue;
          dp[i+1][j+k] = max(dp[i+1][j+k], dp[i][j]);
        }
      }
    }
    cout << ans.first << ' ' << ans.second << endl;
  }

  // end-----------------------------------------------
  // cerr << 1.0 * (clock() - ti) / CLOCKS_PER_SEC << endl;
}

// #include<iostream>
// #include<algorithm>
// #include<math.h>
//
// using namespace std;
//
// int m,n;
// int prime[1002001] = {};
// int tonumber[1001][1001] = {};
// int topoint[1002001][2] = {};
// int dp[1001][1001][2] = {};
// int fp[1001][1001];
//
// int dfs(int x, int y){
//   if(x < 0 || x > 1000 || y < 0 || y > 1000) return 0;
//   if(tonumber[x][y] == 0) return 0;
//   fp[x][y] = 1;
//   if(x > 0 && y < 1000) if(!fp[x-1][y+1])dfs(x-1, y+1);
//   if(y < 1000) if(!fp[x][y+1])dfs(x, y+1);
//   if(x < 1000 && y < 1000) if(!fp[x+1][y+1])dfs(x+1, y+1);
//   dp[x][y][0] = dp[x][y+1][0];
//   dp[x][y][1] = dp[x][y+1][1];
//   if(tonumber[x-1][y+1] != 0){
//     if(dp[x][y][0] == dp[x-1][y+1][0]){
//       dp[x][y][0] = dp[x-1][y+1][0];
//       dp[x][y][1] = max(dp[x][y][1], dp[x-1][y+1][1]);
//     }
//     if(dp[x][y][0] < dp[x-1][y+1][0]){
//       dp[x][y][0] = dp[x-1][y+1][0];
//       dp[x][y][1] = dp[x-1][y+1][1];
//     }
//   }
//   if(tonumber[x+1][y+1] != 0){
//     if(dp[x][y][0] == dp[x+1][y+1][0]){
//       dp[x][y][0] = dp[x+1][y+1][0];
//       dp[x][y][1] = max(dp[x][y][1], dp[x+1][y+1][1]);
//     }
//     if(dp[x][y][0] < dp[x+1][y+1][0]){
//       dp[x][y][0] = dp[x+1][y+1][0];
//       dp[x][y][1] = dp[x+1][y+1][1];
//     }
//   }
//   if(prime[tonumber[x][y]] == 1){
//     dp[x][y][0]++;
//     if(dp[x][y][0] == 1){
//       dp[x][y][1] = tonumber[x][y];
//     }
//   }
//   return 0;
// }
//
// int main(){
//   for(int i = 2; i < 1002001; i++) prime[i] = 1;
//   for(int i = 2; i < 60000; i++){
//     if(prime[i] == 0) continue;
//     for(int j = 2; i * j < 1002001; j++){
//       prime[i*j] = 0;
//     }
//   }
//   int x,y;
//   while(cin >> m >> n && m != 0){
//     x = 500;
//     y = 500;
//     int k = 1;
//
//     for(int i = 0; i <= 1000; i++){
//       for(int j = 0; j <= 1000 ; j++){
//         dp[i][j][0] = 0;
//         dp[i][j][1] = 0;
//         tonumber[i][j] = 0;
//         fp[i][j] = 0;
//       }
//     }
//     tonumber[x][y] = 1;
//     topoint[1][0] = x;
//     topoint[1][1] = y;
//     for(int i = 1; i <= m; i++){
//       for(int t = 0 ; t < k && i < m; t++){
//         x++;
//         i++;
//         topoint[i][0] = x;
//         topoint[i][1] = y;
//         tonumber[x][y] = i;
//       }
//       for(int t = 0; t < k && i < m; t++){
//         y--;
//         i++;
//         topoint[i][0] = x;
//         topoint[i][1] = y;
//         tonumber[x][y] = i;
//       }
//       k++;
//       for(int t = 0 ; t < k && i < m; t++){
//         x--;
//         i++;
//         topoint[i][0] = x;
//         topoint[i][1] = y;
//         tonumber[x][y] = i;
//       }
//       for(int t = 0; t < k && i < m; t++){
//         y++;
//         i++;
//         topoint[i][0] = x;
//         topoint[i][1] = y;
//         tonumber[x][y] = i;
//       }
//       if(i == m) break;
//       else i--;
//       k++;
//     }
//     int a = dfs(topoint[n][0], topoint[n][1]);
//     if(dp[topoint[n][0]][topoint[n][1]][0] == 0) cout << "0 0" << endl;
//     else cout << dp[topoint[n][0]][topoint[n][1]][0] << ' ' << dp[topoint[n][0]][topoint[n][1]][1] << endl;
//   }
// }



Measured memory_bytes: 41208