#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
using namespace std;
bool Judge(int z[],int num){ //判断数组z所存数是否为回文数,num为位数
for(int i=0;i<=num/2;i++){
if(z[i]!=z[num-1-i]){ //如果位置i与对称位置num-1-i不相同
return false;
}
}
return true; //所有位置都对称
}
int main(){
int n,b,z[40] ,num=0; //数组存放转换结果,num为其位数
scanf("%d%d",&n,&b);
do{ //将n转换为b进制,结果存在数组z中
z[num++]=n%b; //除基取余
n/=b;
}while(n!=0);//当n变为0时退出循环
bool flag=Judge(z,num); //判断数组z保存的数是否回文
if(flag==true) printf("Yes\n");
else printf("No\n");
for(int i=num-1;i>=0;i--){ //注意输出数组是从后往前的!!!
printf("%d",z[i]);
if(i!=0) printf(" ");
}
system("pause");
return 0;
}