#include <bits/stdc++.h>
#define N 1000011
using namespace std;
int mp[2000][2000];
int dx[]={1,0,-1,0},dy[]={0,-1,0,1};//>, ^,<,v
bool prime[N];

void mk_mp(){
  mp[1000][1000]=1;  
  int x=1001,y=1000,dir=0,num=2;
  while(num<N+N){
    mp[y][x]=num;
    int ndir=(dir+1)%4,nx=x+dx[ndir],ny=y+dy[ndir];
    if(mp[ny][nx]==0) dir=ndir;
    else x+=dx[dir],y+=dy[dir],num++;
  }
}

typedef pair<int,int> P;
int n,m;
P mem[2000][2000];
int used[2000][2000];
P dfs(int y,int x){
  if(mp[y][x]>m)return P(0,0);
  if(used[y][x]++) return mem[y][x];
  P res=max(dfs(y+1,x-1),max(dfs(y+1,x),dfs(y+1,x+1)));
  if(!prime[mp[y][x]]){
    res.first++;
    if(res.second==0)res.second=mp[y][x];
  }
  return mem[y][x]=res;
}


int main(){
  prime[0]=prime[1]=1;
  for(int i=2;i*i<N;i++)
    if(!prime[i])
      for(int j=2;j<=N/i;j++) prime[i*j]=1;
  mk_mp();
  while(1){
    cin>>m>>n;
    if(!n&&!m)return 0;
    memset(used,0,sizeof(used));
    int x=-1,y=-1;
    for(int i=0;i<2000&&x==-1;i++)
      for(int j=0;j<2000&&x==-1;j++)if(mp[i][j]==n)x=j,y=i ;
    P ans=dfs(y,x);
    cout <<ans.first<<" "<<ans.second<<endl;
  }
  return 0;
}