#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int ana[1000][1000], sosuu[1000001], dp[1000][1000], maxprime[1000][1000], pointx[1000001], pointy[1000001], dx[3] = {-1, 0, 1};

int max(int a, int b, int c){
    if(a>=b && a>=c) return a;
    else if(b>=a && b>=c) return b;
    else if(c>=a && c>=b) return c;
}

void setdou(int m){
    int x=500, y=500, i, j, k, p=1;
    for(i=0;i<1000;i++) for(j=0;j<1000;j++) ana[i][j] = 0;
    i=1;
    j=2;
    ana[y][x-1] = p;
    pointx[p] = x-1;
    pointy[p] = y;
    p++;
    if(p > m) return;
    ana[y][x] = p;
    pointx[p] = x;
    pointy[p] = y;
    p++;
    if(p > m) return;
    for(k=1;k<=i;k++){ //ue
        y--;
        ana[y][x] = p;
        pointx[p] = x;
        pointy[p] = y;
        p++;
    }
    if(p > m) return;
    for(k=1;k<=j;k++){ //hidari
        x--;
        ana[y][x] = p;
        pointx[p] = x;
        pointy[p] = y;
        p++;
    }
    if(p > m) return;
    for(i=2,j=3;i<1000&&j<1000;i++,j++){
        for(k=1;k<=i;k++){ //sita
            y++;
            ana[y][x] = p;
            pointx[p] = x;
            pointy[p] = y;
            p++;
        if(p > m) return;
        }
        i++;
        for(k=1;k<=j;k++){ //migi
            x++;
            ana[y][x] = p;
            pointx[p] = x;
            pointy[p] = y;
            p++;
        if(p > m) return;
        }
        j++;
        for(k=1;k<=i;k++){ //ue
            y--;
            ana[y][x] = p;
            pointx[p] = x;
            pointy[p] = y;
            p++;
        if(p > m) return;
        }
        for(k=1;k<=j;k++){ //hidari
            x--;
            ana[y][x] = p;
            pointx[p] = x;
            pointy[p] = y;
            p++;
        if(p > m) return;
        }
    }
}

int main(void){
    int n, m, p=3, i, j, k;

    // エラトステネスの篩
    for(i=0;i<1000001;i++) sosuu[i] = 1;
    sosuu[1] = 0;
    for(i=1;i*i<1000001;i++) if (sosuu[i]) for (j=i*2;j<1000001;j+=i) sosuu[j] = 0;
    
    //入力と探索
    while(1){
        int m=0, n=0, x, y, e;
        scanf("%d %d", &m, &n);
        if(m==0 && n==0) break;
        setdou(m);
        for(i=0;i<1000;i++) for(j=0;j<1000;j++) dp[i][j] = -1;
        x = pointx[n];
        y = pointy[n];
        dp[y][x] = sosuu[n];

        //dpテーブルの作成
        int answer = 0;
        for(i=0;i<1000;i++){
            for(j=0;j<1000;j++){
                answer = max(answer, dp[i][j], -10000);
                if(ana[i][j] == 0) continue;
                if(dp[i][j] != -1){
                    if((i+1) >= 1000) continue;
                    for(e=0;e<3;e++){
                        int nx = j + dx[e];
                        if(nx < 0 || 1000 <= nx) continue;
                        if(ana[i+1][nx] == 0) continue;
                        dp[i+1][nx] = max(dp[i+1][nx], dp[i][j]+sosuu[ana[i+1][nx]], -10000);
                        answer = max(answer, dp[i+1][nx], -10000);
                    }
                }
            }
        }

        //同じdp数のところから最後に通る素数を出す
        int saigo = 0;
        for(i=0;i<1000;i++){
            for(j=0;j<1000;j++){
                if(ana[i][j] == 0) continue;
                if(dp[i][j] == answer){
                    if(sosuu[ana[i][j]]){
                        saigo = max(saigo, ana[i][j], -10000);
                    }
                }
            }
        }
        if(answer == 0) printf("0 0\n");
        else printf("%d %d\n", answer, saigo);
    }
    return 0;
}
