#include<iostream>
#include<algorithm>
using namespace std;
int map[2000][2000],dp[2000][2000];
int isprime[200];
bool prime[1000001];
bool square;
void issquare(int n){
	square=false;
	for(int i=2;i*i<=n;i++)if(n==i*i)square=true;
	return;
}
int main(){
	for(int i=0;i<=1000000;i++)prime[i]=true;
	prime[1]=false;
	int pcnt=0;
	for(int i=2;i<1000;i++){
		bool ok=true;
		for(int j=0;j<pcnt;j++)if(i%isprime[j]==0)ok=false;
		if(ok){
			for(int j=i*i;j<=1000000;j+=i)prime[j]=false;
			isprime[pcnt]=i,pcnt++;
		}
	}
	for(int i=0;i<2000;i++)for(int j=0;j<2000;j++){map[i][j]=-1,dp[i][j]=-10000;}
	int dx[4]={1,0,-1,0},dy[4]={0,-1,0,1};
	int x=1000,y=1000,s=0,t=1,r=1;
	map[999][999]=1;
	for(int k=1;k<=1000000;k++){
		map[y][x]=k;
		y+=dy[r],x+=dx[r];
		issquare(k+1);
		if(square)t++;
		if(s==t){r=(r+1)%4;s=0;}
		s++;
	}//prepara
	int n,m;
	while(true){
		cin>>m>>n;
		if(n==0&&m==0)break;
		for(int i=0;i<2000;i++)for(int j=0;j<2000;j++)dp[i][j]=-10000;
		int x=0,y=0;
		bool end=false;
		while(true){
			while(true){
				if(map[y][x]==n){end=true;break;}
				x++;if(x==2000)break;
			}if(end)break;y++;
		}
		int ans=0,set=0;
		dp[y][x]=0;
		for(int i=1;i<2000;i++){
			for(int j=1;j<1999;j++){
				if(map[i][j]>0&&map[i][j]<=m){
					for(int k=j-1;k<=j+1;k++)if(map[i-1][k]<=m)dp[i][j]=max(dp[i][j],dp[i-1][k]);
					dp[i][j]+=prime[map[i][j]];
					if(ans<dp[i][j])ans=dp[i][j],set=map[i][j];
					if(ans==dp[i][j]&&prime[map[i][j]]==true&&set<map[i][j])set=map[i][j];
				}
			}
		}
		cout<<ans<<" "<<set<<endl;
	}
	return 0;
}