/*
分析:
无耻啊,这么多打表过的,囧~~~
刚学acm时候没有ac掉的陈年旧题了,思路就在代码里,
就是自己生成回文素数,偶数位的除了11,其它的都不必考虑
了,因为偶数位的回文数是可以被11整除的。其余的都在代码
里面了,囧~~~
PS:符合条件的数只有700+,所以打表也挺轻松的。。。
2012-11-10
*/
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
char num[10000111];
int ans[100000],k;
int base[20];
void getprime()
{
int i,l;
memset(num,-1,sizeof(num));
num[0]=num[1]=0;
for(i=2;i<=10000000;i++)
{
if(num[i])
{
for(l=2*i;l<=10000000;l+=i)
{
num[l]=0;
}
}
}
}
int flag;
void getans(int len)
{
int i;
int temp=0;
for(i=len-1;i>=0;i--) {temp*=10;temp+=base[i];}
if(num[temp])
{
if(flag==0 && temp>11)
{
ans[k++]=11;
flag=1;
}
ans[k++]=temp;
}
}
void create(int len,int k)
{
int j;
if(k+1==len) j=1;
else j=0;
for(;j<=9;j++)
{
base[k]=base[len-1-k]=j;
if(k==len/2) {getans(len);continue;}
create(len,k-1);
}
}
int main()
{
int i;
int a,b;
int low,mid,up;
getprime();
flag=k=0;
for(i=1;i<=7;i+=2) create(i,i-1);
while(scanf("%d%d",&a,&b)!=-1)
{
low=0;up=k-1;mid=(low+up)>>1;
while(low<=up)
{
if(ans[mid]<a) low=mid+1;
else up=mid-1;
mid=(low+up)>>1;
}
for(;low<k;low++)
{
if(ans[low]<=b) printf("%d\n",ans[low]);
else break;
}
printf("\n");
}
return 0;
}