#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1000001;
//int prime[];
bool isprime[maxn]={false};
bool S[maxn]={false};
int buf[11]={0};
void judeprime(){
for(int i=2;i<maxn;i++){
if(isprime[i]==true) continue;
S[i]=true;
for(int j=i+i;j<maxn;j+=i){
isprime[j]=true;
}
}
}
int ChangeToD(int n,int d){
int len=0;
do{
buf[len++]=n%d;
n/=d;
}while(n!=0);
return len;
}
int calculate(int n,int d){
int ans=0;
for(int i=0;i<n;i++) {
ans=ans*d+buf[i];
}
return ans;
}
int main(int argc, char** argv) {
judeprime();
int n,d,l;
scanf("%d %d",&n,&d);
l=ChangeToD(n,d);
reverse(buf,buf+l);
// for(int i=0;i<l;i++) printf("%d ",buf[i]);
// putchar('\n');
reverse(buf,buf+l);
// for(int i=0;i<l;i++) printf("%d ",buf[i]);
// putchar('\n');
// printf("%d",calculate(l,d));
if(S[buf[calculate(l,d)]]==true){
printf("Yes");
}else printf("No");
return 0;
}
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=1000001;
bool isprime[maxn]={false};
bool S[maxn]={false};
int buf[111]={0};
//void judeprime(){
// for(int i=2;i<maxn;i++){
// if(isprime[i]==true) continue;
// S[i]=true;
// for(int j=i+i;j<maxn;j+=i){
// isprime[j]=true;
// }
// }
//} why fail
bool judgeprime(int x){
if(x<=1) return false;
int len=(int )sqrt(1.0*x);
for(int i=2;i<=len;i++){
if(x%i==0) return false;
}
return true;
}
int ChangeToD(int n,int d){
int len=0;
do{
buf[len++]=n%d;
n/=d;
}while(n!=0);
return len;
}
int calculate(int n,int d){
int ans=0;
for(int i=0;i<n;i++) {
ans=ans*d+buf[i];
}
return ans;
}
int main(int argc, char** argv) {
// judeprime();
int n,d,l;
while(scanf("%d",&n)!=EOF){
if(n<0) break;
scanf("%d",&d);
if(judgeprime(n)==false){
printf("No\n");
}else{
l=ChangeToD(n,d);
reverse(buf,buf+l);
reverse(buf,buf+l);
// printf("%d",calculate(l,d));
if(judgeprime(calculate(l,d))==true){
printf("Yes\n");
}else printf("No\n");
}
}
return 0;
}