#include <bits/stdc++.h>
#define INF (1e9)
#define N 1050
using namespace std;
int dat[N][N],dp[N][N],ans,ans2;
int m,n,y,x,p,k,sy,sx,check[N][N];
int ymin,ymax,xmin,xmax;
bool prime[N*N];

int main(){
  int dy[4]={0,-1,0,1};
  int dx[4]={1,0,-1,0};
  for(int i=0;i<N*N;i++)prime[i]=true;
  prime[0]=prime[1]=false;
  for(int i=0;i<=N*N/2;i++){
    if(!prime[i])continue;
    for(int j=i+i;j<N*N;j+=i)prime[j]=false;
  }
  while(1){
    for(int i=0;i<N;i++)
      for(int j=0;j<N;j++)dat[i][j]=-1,dp[i][j]=check[i][j]=0;
    cin>>m>>n;
    if(!m&&!n)break;
    sy=sx=y=x=N/2;
    dat[y][x]=1;
    k=ymax=xmax=0,p=1;
    ymin=xmin=INF;
    while(p<m){
      p++;
      int lot=(k+1)%4;
      if(p!=2&&dat[y+dy[lot]][x+dx[lot]]<0)k=lot;
      y+=dy[k];
      x+=dx[k];
      dat[y][x]=p;
      ymin=min(ymin,y);
      xmin=min(xmin,x);
      ymax=max(ymax,y);
      xmax=max(xmax,x);
      if(p==n)sy=y,sx=x;
    }
    check[sy][sx]=1;
    for(int i=ymin;i<=ymax;i++)
      for(int j=xmin;j<=xmax;j++){
	if(!check[i][j])continue;
	check[i+1][j-1]=check[i+1][j]=check[i+1][j+1]=1;
      }
    ans=0;
    for(int i=ymin;i<=ymax;i++){
      for(int j=xmin;j<=xmax;j++){
	if(dat[i][j]<0||!check[i][j])continue;
	if(prime[dat[i][j]])dp[i][j]++;
	ans=max(ans,dp[i][j]);
	dp[i+1][j-1]=max(dp[i+1][j-1],dp[i][j]);
	dp[i+1][j]=max(dp[i+1][j],dp[i][j]);
	dp[i+1][j+1]=max(dp[i+1][j+1],dp[i][j]);
      }
    }
    ans2=0;
    for(int i=ymin;i<=ymax;i++){
      for(int j=xmin;j<=xmax;j++){
	if(prime[dat[i][j]]&&check[i][j]&&ans==dp[i][j])ans2=max(ans2,dat[i][j]);
      }
    }
    if(ans!=0)cout<<ans<<' '<<ans2<<endl;
    else cout<<0<<' '<<0<<endl;
  }
  return 0;
}