#include<iostream>
#include<vector>
#include<string>
#include<algorithm>	
#include<map>
#include<set>
#include<utility>
#include<cmath>
#include<cstring>
#include<queue>
#include<cstdio>
#include<sstream>
#define loop(i,a,b) for(int i=a;i<b;i++) 
#define rep(i,a) loop(i,0,a)
#define pb push_back
#define mp make_pair
#define all(in) in.begin(),in.end()
using namespace std;
//kaewasuretyuui
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<pii> vp;
typedef vector<vp> vvp;
typedef pair<int,pii> pip;
typedef vector<pip>vip;
const double PI=acos(-1);
const double EPS=1e-8;
const int inf=1e8;
int sosu[1000010]={1,1,0};
vvp nu;
vvi dp;
int main(){
	for(int i=2;i*i<1000010;i++)if(sosu[i]==0){
		for(int j=i+i;j<1000010;j+=i)sosu[j]=1;
	}
	nu=vvp(1100,vp(1100,pii(inf,0)));
	int x=550,y=550;
	int dx[]={0,-1,0,1};
	int dy[]={1,0,-1,0};
	int co=1,t=0,tt=1;;
	nu[x][y]=pii(1,0);
	while(1){
		rep(i,co){
			tt++;
			x+=dx[t];y+=dy[t];
			nu[x][y]=pii(tt,sosu[tt]^1);
			if(tt==1000010)break;
		}
		t++;
		if(t==4)t=0;
		if(t==0||t==2)co++;
		if(tt==1000010)break;
	}
	int n,m;
	while(cin>>m>>n,n+m){
		dp=vvi(1100,vi(1100,-1));
		rep(i,1100)rep(j,1100)if(nu[i][j].first==n)dp[i][j]=nu[i][j].second;
		loop(i,20,1080)loop(j,20,1080)if(dp[i][j]>=0&&nu[i][j].first<=m){
			if(nu[i+1][j+1].first<=m)dp[i+1][j+1]=max(dp[i+1][j+1],dp[i][j]+nu[i+1][j+1].second);
			if(nu[i+1][j].first<=m)dp[i+1][j]=max(dp[i+1][j],dp[i][j]+nu[i+1][j].second);
			if(nu[i+1][j-1].first<=m)dp[i+1][j-1]=max(dp[i+1][j-1],dp[i][j]+nu[i+1][j-1].second);
		}
		int out=-1,q=0;
		rep(i,1090)rep(j,1090)if(out<=dp[i][j]&&nu[i][j].second){
			if(out==dp[i][j])q=max(q,nu[i][j].first);
			else q=nu[i][j].first;
			out=max(dp[i][j],out);
		}
		if(out<=0)cout<<0<<" "<<0<<endl;
		else cout<<out<<" "<<q<<endl;
	}
}