// AOJ 1189: Prime Caves
// 2017.9.21 bal4u@uu
// 2017.12.22

#include <stdio.h>
#include <string.h>

#define MAX  1020000
#define N    1010
#define SQRT 1009     // sqrt(MAX)
#define max(a,b) ((a)>=(b)?(a):(b))

char prime[MAX+2] = {1,1,0};

void mkprime()
{
	int i, j;

	for (i = 4; i <= MAX; i += 2) prime[i] = 1;
	for (i = 3; i <= SQRT; i += 2)
		if (!prime[i]) for (j = i*i; j <= MAX; j += i) prime[j] = 1;
}

typedef struct { int r, c; } PP;
PP pp[MAX+3];
int map[N+5][N+5];
int dp[N+5][N+5];
int mv[4][2] = { {-1,0},{0,-1},{1,0},{0,1} };
int m, n;

void set()
{
	int i, k, w, w2, r, c, d;

    k = 1, r = c = N >> 1, d = 3, w = 2, w2 = 1;
	while (1) {
		for (i = 0; i < w2; i++) {
			map[r][c] = k, pp[k].r = r, pp[k].c = c, k++;
			r += mv[d][0], c += mv[d][1];
			if (r < 0 || r >= N || c < 0 || c >= N) return;
		}
		if (++d == 4) d = 0;
		w++, w2 = w >> 1;
	}
}

int main()
{
	int r, c, ans, x;

	mkprime(); set();
	while (scanf("%d%d", &m, &n) && m) {
		memset(dp, -1, sizeof(dp));
		r = pp[n].r, c = pp[n].c;
		dp[r][c] = !prime[n];
		for (r = 0; r < N; r++) for (c = 0; c < N; c++) {
			if (dp[r][c] >= 0 && map[r][c] <= m) {
		        if (map[r+1][c-1] <= m)
					dp[r+1][c-1] = max(dp[r+1][c-1], dp[r][c] + !prime[map[r+1][c-1]]); 
		        if (map[r+1][c] <= m)
					dp[r+1][c]   = max(dp[r+1][c],   dp[r][c] + !prime[map[r+1][c]]); 
				if (map[r+1][c+1] <= m)
					dp[r+1][c+1] = max(dp[r+1][c+1], dp[r][c] + !prime[map[r+1][c+1]]); 
			}
		}
		ans = x = 0;
		for (r = 0; r < N; r++) for (c = 0; c < N; c++)
			if (map[r][c] <= m && !prime[map[r][c]])
				if (ans < dp[r][c]) ans = dp[r][c], x = map[r][c];
				else if (ans == dp[r][c] && x < map[r][c]) x = map[r][c];

		printf("%d %d\n", ans, x);
	}
	return 0;
}