#include<bits/stdc++.h>
#define ll unsigned long long
#define debug printf("ciallo\n")
#define rep(i,aaa,bbb) for(int i=(aaa);i<=(bbb);i++)
#define per(i,aaa,bbb) for(int i=(aaa);i>=(bbb);i--)
#define pb push_back
using namespace std;
ll read(){
ll f=1,x=0;
char c=getchar();
while(c>'9'||c<'0'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x*f;
}
ll n,mod;
struct M{
ll m[4][4];
void init(int p=0){
rep(i,0,3)rep(j,0,3){
m[i][j]=0;
}
rep(i,1,3)m[i][i]=p;
}
M operator * (M const &o)const{
M ans;
ans.init();
rep(i,1,3)rep(j,1,3)rep(k,1,3){
ans.m[i][j]=(ans.m[i][j]+m[i][k]*o.m[k][j]%mod)%mod;
}
return ans;
}
M pow(ll k){
M ans,e;
ans.init(1);
rep(i,0,3)rep(j,0,3){
e.m[i][j]=m[i][j];
}
while(k){
if(k&1)ans=ans*e;
e=e*e;
k=k>>1;
}
return ans;
}
};
int main(){
n=read(),mod=read();
ll x=0;
ll i=10;
ll k=9;
while(n>=k){
M e;
e.init(),e.m[1][1]=i%mod,e.m[1][2]=e.m[2][2]=e.m[2][3]=e.m[3][3]=1;
e=e.pow(k);
x=x*e.m[1][1]%mod+(i/10)*e.m[1][2]%mod+e.m[1][3]%mod;
x%=mod;
i=i*10;
n-=k;
k*=10;
}
M e;
e.init(),e.m[1][1]=i,e.m[1][2]=e.m[2][2]=e.m[2][3]=e.m[3][3]=1;
e=e.pow(n);
x=x*e.m[1][1]%mod+(i/10)*e.m[1][2]%mod+e.m[1][3]%mod;
printf("%lld",x%mod);
return 0;
}