#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct mrx{
ll d[3][3];
}a,b;
ll n,m,f=0;
mrx qc(mrx x,mrx y){
mrx ret;
for(int i=0;i<3;i++) for(int j=0;j<3;j++) ret.d[i][j]=0;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
for(int z=0;z<3;z++)
ret.d[i][j]=(ret.d[i][j]+x.d[i][z]*y.d[z][j]%m)%m;
return ret;
}
mrx qpow(mrx x,ll y){
mrx ret;
for(int i=0;i<3;i++) for(int j=0;j<3;j++){
if(i==j) ret.d[i][j]=1;
else ret.d[i][j]=0;
}
while(y){
if(y&1) ret=qc(x,ret);
x=qc(x,x);
y/=2;
}
return ret;
}
int main(){
scanf("%lld%lld",&n,&m);
int K=log10(n)+1;
for(int k=1;k<=K;k++){
for(int i=0;i<3;i++) for(int j=0;j<3;j++) a.d[i][j]=b.d[i][j]=0;
a.d[0][0]=(ll)pow(10,k);
a.d[0][1]=a.d[1][1]=a.d[1][2]=a.d[2][2]=1;
b.d[0][0]=f;
b.d[1][0]=(ll)pow(10,k-1);
b.d[2][0]=1;
if(k==K) b=qc(qpow(a,n-(ll)(pow(10,k-1))+1),b);
else b=qc(qpow(a,9*(ll)(pow(10,k-1))),b);
f=b.d[0][0]%m;
}
printf("%lld",f);
return 0;
}