#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#define M 1005
#define N 505
using namespace std;
int adjacent[M][N],adjNo[M];
bool prime[M],visited[M];
void loadAdj();
int main()
{
int i,s,t,clr[M],d[M],h,x,f,k=1;
queue<int>Q;
//freopen("in.txt","r",stdin);
loadAdj();
while(scanf("%d%d",&s,&t)==2 &&(s+t))
{
if(s==t)
{
printf("Case %d: %d\n",k++,0);
continue;
}
for(i=s;i<=t;i++)
clr[i]=0,d[i]=M;
for(i=s;i<=t;i++)
visited[i]=false;
clr[s]=1,f=0,d[s]=0;
Q.push(s);
while(!Q.empty())
{
h=Q.front();
for(i=0;i<adjNo[h];i++)
{
x=adjacent[h][i];
if(x>t || visited[x])continue;
visited[x]=true;
if(clr[x]==0)
clr[x]=1,d[x]=d[h]+1;
Q.push(x);
if(x==t)
{
f=1;
goto END;
}
}
Q.pop();
clr[h]=2;
}
END:
if(f)
printf("Case %d: %d\n",k++,d[x]);
else
printf("Case %d: %d\n",k++,-1);
while(!Q.empty())
Q.pop();
}
return 0;
}
void loadAdj()
{
int i,j,s=M/2;
for(i=2;i<M;i++)
prime[i]=true;
for(i=0;i<N;i++)
adjNo[i]=0;
for(i=2;i<=s;i++)
{
if(prime[i])
for(j=i+i;j<M;j=j+i)
{
prime[j]=false;
adjacent[j][adjNo[j]++]=j+i;
}
}
}
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.