#include<stdio.h>
#include<string.h>
using namespace std;
FILE*f=fopen("frac.in","r");
FILE*g=fopen("frac.out","w");
int w,nrsum,sn,j,i,aux,dim,dim2,ok,fract[100][100],v2[10],cop[10],cop2[10],s1[10],sum[100][100],x2[20],div[20],n[20],p[20],ct[20],r[20],q[20],x[20];
char c;
void inc(int a[]) {
int i=1,r;
a[1]++;
while(a[i]>9) {
r=a[i]/10;
a[i]%=10;
a[++i]+=r;
}
if(i>a[0]) a[0]=i;
}
void dec(int a[]) {
int i=1;
a[i]--;
while(a[i]<0) {
a[i]=a[i]+10;
a[i+1]--;
i++;
}
}
int compar(int a[], int b[]) {
int i;
if(a[0]>b[0]) return 1;
else if(b[0]>a[0]) return 2;
else {
i=a[0];
while(b[i]==a[i]&&i!=0) i--;
if(i==0) return 1;
else if(a[i]>b[i]) return 1;
else return 2;
}
}
void scad(int a[], int b[]) {
int i;
for(i=1;i<=a[0];i++) {
a[i]=a[i]-b[i];
if(a[i]<0) {a[i]=a[i]+10; a[i+1]--;}
}
i=a[0];
while(a[i]==0&&i>=1) i--;
a[0]=i;
}
void impartire(int a[], int b[]) {
int i,j,k;
memset(ct,0,sizeof(ct));
memset(r,0,sizeof(r));
for(i=a[0];i>=1;i--) {
ct[i]=0;
for(j=r[0];j>=1;j--) r[j+1]=r[j];
r[1]=a[i]; r[0]++;
k=a[0];
while(r[k]==0) k--;
r[0]=k;
while(compar(r,b)==1) {
scad(r,b);
ct[i]++;
}
}
i=a[0];
while(ct[i]==0) i--;
ct[0]=i;
}
int verif1(int a[]) {
int i;
if(a[a[0]]!=1) return 1;
for(i=1;i<a[0];i++) {
if(a[i]!=0) return 1;
}
return 0;
}
void produs(int a[], int b[]) {
int i,j,d,r,f;
d=0; r=0;
for(i=1;i<=a[0];i++) {
j=1;
while(j<=b[0]||r!=0) {
f=a[i]*b[j]+r;
q[j+d]=f%10;
r=f/10;
j++;
}
d++;
}
i=j+d;
while(q[i]==0) i--;
q[0]=i;
}
void copiere(int a[], int b[]) {
int i;
for(i=0;i<=a[0];i++) a[i]=0;
for(i=0;i<=b[0];i++) a[i]=b[i];
}
void adun(int a[],int b[]) {
int l,f,r,i;
if(a[0]>b[0]) l=a[0];
else l=b[0];
r=0;
for(i=1;i<=l||r!=0;i++) {
f=b[i]+a[i]+r;
b[i]=f%10;
r=f/10;
}
b[0]=i-1;
}
int main() {
do {
fscanf(f,"%c",&c);
if(c==' ') break;
n[++dim]=c-'0';
}while(1);
n[0]=dim;
for(i=1;i<=n[0]/2;i++) {
aux=n[i];
n[i]=n[n[0]-i+1];
n[n[0]-i+1]=aux;
}
do {
fscanf(f,"%c",&c);
if(c=='\n') break;
p[++dim2]=c-'0';
}while(1);
p[0]=dim2;
for(i=1;i<=p[0]/2;i++) {
aux=p[i];
p[i]=p[p[0]-i+1];
p[p[0]-i+1]=aux;
}
dim=0; div[0]=1; div[1]=2; x[0]=1; x[1]=1;
while(verif1(n)&&div[0]<=6) {
impartire(n,div);
ok=0;
while(r[0]==0) {
copiere(n,ct);
impartire(n,div);
ok=1;
}
if(ok==1) {
produs(div,x);
copiere(x,q);
++dim;
for(i=0;i<=div[0];i++) fract[dim][i]=div[i];
}
inc(div);
}
if(verif1(n)==1) {
produs(div,x);
copiere(x,q);
++dim;
for(i=0;i<=div[0];i++) fract[dim][i]=div[i];
}
produs(x,p);
copiere(x2,q);
v2[0]=1; v2[1]=2;
for(i=1;i<=dim;i++) {
for(j=0;j<=fract[i][0];j++) cop[j]=fract[i][j];
memset(q,0,sizeof(q));
impartire(x,cop);
produs(ct,v2);
adun(q,s1);
}
nrsum=1; sum[1][0]=1; sum[1][1]=1;
for(i=1;i<=dim;i++) {
sn=nrsum;
for(j=0;j<=fract[i][0];j++) cop[j]=fract[i][j];
for(w=1;w<=nrsum;w++) {
memset(q,0,sizeof(q));
for(j=0;j<=sum[w][0];j++) cop2[j]=sum[w][j];
produs(cop,cop2);
sn++;
for(j=0;j<=q[0];j++) sum[sn][j]=q[j];
}
nrsum=sn;
}
for(i=1;i<nrsum;i++) {
for(j=0;j<=sum[i][0];j++) cop2[j]=sum[i][j];
adun(cop2,x);
}
scad(x,s1);
impartire(x2,x);
copiere(x2,ct);
ok=1;
while(ok==1) {
ok=0;
for(i=1;i<=dim;i++) {
for(j=0;j<=fract[i][0];j++) cop[j]=fract[i][j];
impartire(x2,cop);
if(r[0]==0) {ok=1; dec(x2); break;}
}
}
for(i=x2[0];i>=1;i--) fprintf(g,"%d",x2[i]);
return 0;
}