#include using namespace std; #define rep(i,a,b) for(ll i=a;i=b;i--) #define ll long long #define ull unsigned long long #define ld long double #define bl __int128_t #define fi first #define se second #define vel vector #define vvel vector> #define vvepll vector #define pll pair #define vepll vector #define ves vector #define vem vector #define vvem vector #define bl __int128_t #define cleout(i) cout<using PQ=priority_queue,greater>; // 上 右 下 左 vector dx={ -1, 0, 1, 0 }; vector dy={ 0, 1, 0, -1 }; vector ddx={ 1, 1, 1, 0, -1, -1, -1, 0 }; vector ddy={ 1, 0, -1, -1, -1, 0, 1, 1 }; ll N, K, M, L, R, T, Q, H, W, i, j, l, r; ll x, y, z; unsigned long long q; string S; long double k; ll inf=1000000000000000000;//1e18 // inf=1e9+7; // LLONG_MAX //mt19937_64 rng((ull) chrono::steady_clock::now().time_since_epoch().count()); //[x^M]1/(1-x)^N=comb(N-1+M,M) struct mint{ ll num; static ll P; static void set_mod(ll MOD){ P=MOD; } mint(ll x=0){ if(x<0){ x*=-1; x%=P; x=P-x; } x%=P; num=x; } mint operator+(const mint &other)const{ return mint(num+other.num); } mint operator-(const mint &other)const{ return mint(num-other.num); } mint operator*(const mint &other)const{ return mint(num*other.num); } mint &operator+=(const mint &other){ num+=other.num; if(num>=P) num-=P; return *this; } mint &operator-=(const mint &other){ num-=other.num; if(num<0) num+=P; return *this; } mint &operator*=(const mint &other){ num=(num*other.num)%P; return *this; } mint beki(const ll &x)const{ mint res=1; mint now=num; rep(i,0,60){ if(x&(1ll<>(istream& is,mint& m){ ll x; is>>x; m=mint(x); return is; } }; ll mint::P=998244353; //ll mint::P=1000000007; void _solve(){ ll p; cin>>N>>p; mint::set_mod(p); mint ans=0; unordered_set se; rep(i,1,10){ rep(j,0,10){ rep(k,0,10){ ll now=0; now+=10*i+i; now*=100; now+=10*j+k; now*=100; now+=k*10+j; rep(l,1,10000){ if(abs(now*l)<=N){ if(!se.count(now*l))ans-=(mint)(now)*(mint)l; se.insert(now*l); }else break; } } } } cout<>_; else _=1; rep(__,0,_){ _solve(); } }