#include <stdio.h>
#define MAX_M 1000000
#define DIV_MM 1000 
#define MAP_SIZE 1002 // MAP_SIZE = ceiling(sqrt(MAX_M))+2
// ???????????????????????§??????????´???´?????¨???????????????
#define CENTER 500 // ??????????´???´?????????
typedef struct map_type {
 int id; // ?´???´?????????
 int np; // ?????????????§???????????????????????´???°?´???´????????°
 int lp; // ????¨????????????????????????§??????????????????????´???°?´???´??????????????§???
} map_t;
map_t map[MAP_SIZE][MAP_SIZE]; // ?´???´????????????
int is_prime[MAX_M+1]; // ?´???°??¨???is_prime[i]=1 <--> i ????´???°
// ?´???´?????????????????????????§?????????? 0??????, 1??????, 2??????, 3??????
int dx[ ] = {1, 0, -1, 0};
int dy[ ] = {0, -1, 0, 1};
int m, n; // m = ?´???´????????°??? n = ??????????´???´??????
int nx, ny;// ??????????´???´?????????
int min_x, max_x, min_y, max_y; // ?????????: ??????????°????,?????§???,?????????????°????,?????§???
void init_map(void) // ?´???´??????????????????????????????
{
 int i,j;
 for(i=0; i<MAP_SIZE; i++)
 for(j=0; j<MAP_SIZE; j++){
 map[i][j].id = map[i][j].lp = 0;
 map[i][j].np = -1;
 }
}
// ??????????????????
void gen_map(void)
{
 int x, y, len, dir, i,j,id;
 init_map(); // ?????????????????????
 x = y = CENTER; // 1 ???????´???´?????????
 min_x = max_x = min_y = max_y = CENTER;
 map[y][x].id = 1;
 if(n == 1){ // ???????????\????´???´?????????????????????????????? nx,ny ????????????
 nx = x; ny = y;
 }
 len = 1; dir = 0; id = 2;
 while(id <= m){ // id ????´???´????????° m ?????????????????§??\????????°?????????
 for(i=0; i<2; i++){ // ????????????????§???????????????°?????????
 for(j=0; j<len; j++){ // dir ??????????????? len ?§????
x += dx[dir]; y += dy[dir];
if(x > max_x) max_x = x; // max_x ?????´??°
if(x < min_x) min_x = x; // min_x ?????´??°
if(y > max_y) max_y = y; // max_y ?????´??°
if(y < min_y) min_y = y; // min_y ?????´??°
if(id == n){ // ???????????\????´???´?????????????????? nx,ny ????????????
 nx = x; ny = y;
}
map[y][x].id = id++; // ?´???´??????????????????
if(id > m) break;
 }
 dir = (dir+1)%4; // ????????????????????????
 if(id > m) break;
 }
 len++;
 }
}
// ?´???°??¨?????????(??¨??????????????????????????????)
// is_prime[i] = 1 <--> i ????´???°, is_prime[i] = 0 <--> i ???????´???°
void gen_prime()
{
 int i,j;
 for(i=0; i<= MAX_M; i++) is_prime[i] = 1; // ??¨??????????????¨????´???°??¨??????
 is_prime[0] = is_prime[1] = 0; // 0, 1 ???????´???°
 for(i=2; i<=DIV_MM; i++){ // DIV_MM ?????§????´???°????????????????????§????????§??????
 if(is_prime[i]){ // i ????´???°?????¨???
 for(j = 2*i; j<=MAX_M; j += i) // i ????????°???????´???°
is_prime[j] = 0;
 }
 }
}
// ??±???????????¢?´¢??§?±???????
map_t dfs(int x, int y)
{
 map_t d;
 int id, np, lp, dx;
 if(map[y][x].id == 0){ // ?´???´??§?????????
 d.id = d.np = d.lp = 0;
 }
 else if(map[y][x].np >= 0){ // ??¢????¨??????????
 d =map[y][x];
 }
 else {
 np = lp = 0;
 id = map[y][x].id;
 for(dx=-1; dx <= 1; dx++){ // ?§??????????????????????????±?????´???´????????????
 d = dfs(x+dx, y+1); // ?´???°?´???´??°??¨???????´???°?´???´??????????±???????
 if(d.np > np){ // ?´???°?´???´??°???????????§???????????°
np = d.np; // ?´???°?´???´??°??¨
lp = d.lp; // ???????´???°?´???´???????????´??°
 }
 else if(d.np == np){ // ?´???°?´???´??°???????????´??????
if(d.lp > lp) lp = d.lp; // ???????´???°?´???´???????????§?????????????????¨
 }
 }
 if(is_prime[id]){ // ??????????´???°?´???´?????´???
 if(np == 0) // ????????????????±????????????????????´???°?´???´??????????????°
lp = id; // ???????´???°?´???´??????????´???°?´???´??¨??????
 np++; // ?????????????´???°?´???´??°???????¢???????
 }
 d.id = id; d.np = np; d.lp = lp;
 map[y][x] = d;
 }
 return d;
}
int main()
{
 int x, y, dx, np, lp;
 map_t d;
 gen_prime(); // ?´???°??¨?????????
 while(1){
 scanf("%d %d?\n", &m, &n); // m, n ?????\???
 if(m==0 && n==0) break; // ??±??? 0 ????????????
 gen_map(); // ??????????????????
 d = dfs(nx,ny);
 printf("%d %d?\n", d.np, d.lp);
 }
return 0;
}