#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define re register
#define int unsigned long long
快读略
int n,m;
struct matrix
{
int r,c;int ma[10][10];
matrix operator *(matrix o)
{
matrix ret;ret.r =r;ret.c =o.c ;
for (int i=1;i<=r;++i)
{
for (int j=1;j<=o.c ;++j)
{
ret.ma [i][j]=0;
for (int k=1;k<=c;++k)
{
ret.ma [i][j]+=ma[i][k]%m*o.ma [k][j]%m;
ret.ma [i][j]%=m;
}
}
}
return ret;
}
matrix()
{
r=0;c=0;memset(ma,0,sizeof ma);
}
}beg,ch;
matrix operator ^(matrix &m,int up)
{
matrix t;
if (up==1) return m;
int tmp=up&1;up>>=1;
t=m^up;
t=t*t;
if (tmp)
{
t=t*m;
}
return t;
}
int po[30];
int log10(int a)
{
for (int i=1;i<=18;++i)
{
if (po[i]>a)
{
return i-1;
}
}
}
signed main()
{
n=read();m=read();po[0]=1;
for (int i=1;i<=18;++i) po[i]=10*po[i-1];
beg.r =1;beg.c =3;
beg.ma [1][1]=0;beg.ma [1][2]=0;beg.ma [1][3]=1;
for (int i=1;i<=log10(n);++i)
{
ch.r =3;ch.c =3;
ch.ma [1][1]=po[i];ch.ma [1][2]=0;ch.ma [1][3]=0;
ch.ma [2][1]=1;ch.ma [2][2]=1;ch.ma [2][3]=0;
ch.ma [3][1]=1;ch.ma [3][2]=1;ch.ma [3][3]=1;
ch=(ch^(po[i]-po[i-1]));
beg=beg*ch;
beg.ma [1][2]=po[i]-1;beg.ma [1][3]=1;
}
beg.ma [1][1]%=m;beg.ma [1][2]%=m;beg.ma [1][3]%=m;
int i=log10(n)+1;
if (n==po[i-1]-1)
{
cout<<beg.ma [1][1]%m;
return 0;
}
ch.r =3;ch.c =3;
ch.ma [1][1]=po[i]%m;ch.ma [1][2]=0;ch.ma [1][3]=0;
ch.ma [2][1]=1;ch.ma [2][2]=1;ch.ma [2][3]=0;
ch.ma [3][1]=1;ch.ma [3][2]=1;ch.ma [3][3]=1;
ch=(ch^(n-po[i-1]+1));
beg=beg*ch;
cout<<beg.ma [1][1]%m;
fclose(stdin);
fclose(stdout);
return 0;
}