bool DBG = false;
// #pragma GCC optimize("Ofast")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
// #pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
//#include <boost/multiprecision/cpp_dec_float.hpp>
//#include <boost/multiprecision/cpp_int.hpp>
using namespace std;
using ll = long long;
using ld = long double;
//using i128 = __int128_t;
//using bint = boost::multiprecision::cpp_int
//using d1024 = boost::multiprecision::number<mp::cpp_dec_float<1024>>;
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define IFOR(i,a,b) for(int i=(b-1);i>=(a);--i)
#define RPT(i,a,b) for(int i=(a);i<((a)+(b));++i)
#define IRPT(i,a,b) for(int i=((a)+(b)-1);i>=(a);--i)
#define ALL(x) x.begin(),x.end()
#define RALL(x) x.rbegin(),x.rend()
#define fs first
#define sd second
#define couts(x) cout << (x) << (" ")
#define coutn(x) cout << (x) << ("\n")
#define ncouts(x) numout(x),outst[outst_N++] = ' '
#define ncoutn(x) numout(x),outst[outst_N++] = '\n'
#define scouts(x) strout(x),outst[outst_N++] = ' '
#define scoutn(x) strout(x),outst[outst_N++] = '\n'
#define dcouts(x) if(DBG) couts(x)
#define dcoutn(x) if(DBG) coutn(x)
#define endl "\n"
#define psb push_back
#define ppb pop_back
#define eb emplace_back
#define lb lower_bound
#define ub upper_bound
#define LBIT(x,a) (((x)>>(a))&1LL)
#define IBIT(x,a) (((x)>>(a))&1)
#define BCOUNT(x) (__builtin_popcount(x))
template<typename T> std::istream &operator>>(std::istream &is, std::vector<T> &vec){ for (auto &v : vec) is >> v; return is; }
template<typename T1, typename T2> std::istream &operator>>(std::istream &is, std::pair<T1,T2> &p){is >> p.first >> p.second; return is; }
template<typename T> std::ostream &operator<<(std::ostream &os, const std::vector<T> &vec){ os << "["; for (auto v : vec) os << v << ","; os << "]"; return os; }
template<typename T> std::ostream &operator<<(std::ostream &os, const std::deque<T> &vec){ os << "deque["; for (auto v : vec) os << v << ","; os << "]"; return os; }
template<typename T> std::ostream &operator<<(std::ostream &os, const std::set<T> &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; }
template<typename T> std::ostream &operator<<(std::ostream &os, const std::unordered_set<T> &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; }
template<typename T> std::ostream &operator<<(std::ostream &os, const std::multiset<T> &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; }
template<typename T> std::ostream &operator<<(std::ostream &os, const std::unordered_multiset<T> &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; }
template<typename T1, typename T2> std::ostream &operator<<(std::ostream &os, const std::pair<T1, T2> &pa){ os << "(" << pa.first << "," << pa.second << ")"; return os; }
template<typename TK, typename TV> std::ostream &operator<<(std::ostream &os, const std::map<TK, TV> &mp){ os << "{"; for (auto v : mp) os << v.first << "=>" << v.second << ","; os << "}"; return os; }
template<typename TK, typename TV> std::ostream &operator<<(std::ostream &os, const std::unordered_map<TK, TV> &mp){ os << "{"; for (auto v : mp) os << v.first << "=>" << v.second << ","; os << "}"; return os; }

template<class T> using V = vector<T>;
template<class T> using V2 = V<V<T>>;
template<class T> using V3 = V<V2<T>>;
template<class T> using V4 = V<V3<T>>;


char outst[20'000'000]; int outst_N = 0;
char outst_tmp[200];
template<class NUM >
void numout(NUM n){
  if(n<0) { n*=-1; outst[outst_N++] = '-';}
  if(n==0){ outst[outst_N++] = '0'; return;}
  int cnt = 0;
  while(n>0){
    outst_tmp[cnt++] = '0' + (n % 10);
    n /= 10;
  }
  IFOR(i,0,cnt){
    outst[outst_N++] = outst_tmp[i];
  }
}
void strout(std::string s){
  for(auto x: s){
    outst[outst_N++] = x;
  }
}




constexpr ll LINF = 1LL << 55;
constexpr int IINF = 1 << 28;
//constexpr ll mod = 1'000'000'007;
ll mod;




struct matrix{
  V2<ll> mt;
  int size;
  matrix(int n){
    mt = V2<ll>(n, V<ll>(n,0));
    size = n;
  }
  matrix () {
  }
};

matrix matmult(matrix &a, matrix &b){
  matrix c;
  if(a.size != b.size) return c;
  c = matrix(a.size);
  int n = c.size;
  FOR(i,0,n)FOR(j,0,n)FOR(k,0,n) {(c.mt[i][j] += a.mt[i][k]*b.mt[k][j] % mod ) %= mod;}
  return c;
}

V<ll> mtvmult(matrix &a, V<ll> v){
  V<ll> b;
  if(a.size != v.size()) return b;
  int n = a.size;
  b = V<ll>(n,0);
  FOR(i,0,n)FOR(j,0,n) {(b[i] += a.mt[i][j] * v[j] % mod)%=mod;}
  return b;
}

matrix matpow(matrix a, ll n){
  int s = a.size;
  matrix res(s);
  FOR(i,0,s) res.mt[i][i] = 1;
  while(n>0){
    if(n&1) res = matmult(res, a);
    a = matmult(a,a);
    n >>= 1;
  }
  return res;
}


void solve(){
  ll l, a, b, m; cin >> l >> a >> b >> m;
  mod = m;
  ll t = 0, s = a ;
  V<ll> tens(20);tens[0] = 1;
  FOR(i,0,18) tens[i+1] = 10* tens[i];tens[0] = 0;
  FOR(i,0,18){
    //s =  max<ll>(0,min<ll>(l-1, ((tens[i]-a+1)/b ))) * b + a;
    matrix mt(3);
    mt.mt = { { tens[i+1] % m, 1, 0},
              { 0      , 1, b % m},
              { 0      , 0, 1} };
    mt = matpow(mt,  max<ll>(0, min<ll>(l ,(tens[i+1]-a+b-1)/b ) ) - max<ll>(0,min<ll>(l ,(tens[i]-a+b-1)/b ) )   );
    //mt = matpow(mt,  min<ll>(l ,(tens[i+1]-a+b-1)/b )  - min<ll>(l ,(tens[i]-a+b-1)/b )  ) ;
    V<ll> v0 = {t % mod, s % mod, 1};
    auto v = mtvmult(mt, v0);
    //couts(s);
    t = v[0];
    s = v[1];
    //couts(s);
    //coutn(t);
  }
  coutn( t );
}

int main(void){
  //std::cout << std::fixed << std::setprecision(20);
  cin.tie(0);
  //ios::sync_with_stdio(false);
  solve();
  printf("%s", outst);
  return 0;
}



Measured memory_bytes: 256