#include <iostream>
#include <cmath>
#include <unordered_map>
#include <map>
#include <cstring>
using namespace std;
int st(int x){//求位数
int num=1;
while(x/10!=0){
num++;
x/=10;
}
return num;
}
//判断素数
bool ss(int x){
for(int i=2;i<sqrt(x)+1;i++){
if(x%i==0){
return false;
}
if(i==(int)sqrt(x)){
return true;
}
}
}
int main(){
int A,B;
cin>>A>>B;
map<int,int>mp;
map<int,int>s;
map<int,int>v_;
for(int i=A;i<=B;i++){
unordered_map<int,int>v;
int temp=i;
int sum=0;
bool flag=true;
bool t=true;
int nu=1;
while(1){
int num=st(temp);
for(int j=0;j<num;j++){
sum+=pow(temp%10,2);
temp/=10;
}
if(sum>=A&&sum<=B){
++v_[sum];
}
if(sum==1)
{
++v_[i];
++s[i];
for(map<int,int>::iterator it=v_.begin();it!=v_.end();it++){
if(it->second>1)
{
++s[it->first];
}
}
break;
}
++v[sum];
nu++;
if(v[sum]>1){
flag=false;
break;
}
temp=sum;
sum=0;
}
if(flag){
if(ss(i)){
mp[i]=2*nu;
}else{
mp[i]=nu;
}
}
}
for(map<int,int>::iterator it=s.begin();it!=s.end();it++){
if(it->second>1)mp[it->first]=0;
}
if(mp.size()==0){
cout<<"SAD";
return 0;
}
for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++){
if(it->second==0)continue;
cout<<it->first<<" "<<it->second<<"\n";
}
return 0;
}