#include <bits/stdc++.h>
using namespace std::literals::string_literals;
using i64 = long long;
using std::cout;
using std::endl;
using std::cin;

template<typename T>
std::vector<T> make_v(size_t a){return std::vector<T>(a);}

template<typename T,typename... Ts>
auto make_v(size_t a,Ts... ts){
  return std::vector<decltype(make_v<T>(ts...))>(a,make_v<T>(ts...));
}

i64 M;

using namespace std;

template< class T >
struct Matrix
{
  vector< vector< T > > A;

  Matrix() {}

  Matrix(size_t n, size_t m) : A(n, vector< T >(m, 0)) {}

  Matrix(size_t n) : A(n, vector< T >(n, 0)) {};

  size_t height() const
  {
    return (A.size());
  }

  size_t width() const
  {
    return (A[0].size());
  }

  inline const vector< T > &operator[](int k) const
  {
    return (A.at(k));
  }

  inline vector< T > &operator[](int k)
  {
    return (A.at(k));
  }

  static Matrix I(size_t n)
  {
    Matrix mat(n);
    for(int i = 0; i < n; i++) mat[i][i] = 1;
    return (mat);
  }

  Matrix &operator+=(const Matrix &B)
  {
    size_t n = height(), m = width();
    assert(n == B.height() && m == B.width());
    for(int i = 0; i < n; i++)
      for(int j = 0; j < m; j++)
        ((*this)[i][j] += B[i][j]) %= M;
    return (*this);
  }

  Matrix &operator-=(const Matrix &B)
  {
    size_t n = height(), m = width();
    assert(n == B.height() && m == B.width());
    for(int i = 0; i < n; i++)
      for(int j = 0; j < m; j++)
        ((*this)[i][j] -= B[i][j]) %= M;
    return (*this);
  }

  Matrix &operator*=(const Matrix &B)
  {
    size_t n = height(), m = B.width(), p = width();
    assert(p == B.height());
    vector< vector< T > > C(n, vector< T >(m, 0));
    for(int i = 0; i < n; i++)
      for(int j = 0; j < m; j++)
        for(int k = 0; k < p; k++)
          C[i][j] = ((C[i][j] + (*this)[i][k] * B[k][j])) % M;
    A.swap(C);
    return (*this);
  }

  Matrix &operator^=(long long k)
  {
    Matrix B = Matrix::I(height());
    while(k > 0) {
      if(k & 1) B *= *this;
      *this *= *this;
      k >>= 1LL;
    }
    A.swap(B.A);
    return (*this);
  }

  Matrix operator+(const Matrix &B) const
  {
    return (Matrix(*this) += B);
  }

  Matrix operator-(const Matrix &B) const
  {
    return (Matrix(*this) -= B);
  }

  Matrix operator*(const Matrix &B) const
  {
    return (Matrix(*this) *= B);
  }

  Matrix operator^(const long long k) const
  {
    return (Matrix(*this) ^= k);
  }

  friend ostream &operator<<(ostream &os, Matrix &p)
  {
    size_t n = p.height(), m = p.width();
    for(int i = 0; i < n; i++) {
      os << "[";
      for(int j = 0; j < m; j++) {
        os << p[i][j] << (j + 1 == m ? "]\n" : ",");
      }
    }
    return (os);
  }


  T determinant()
  {
    Matrix B(*this);
    assert(width() == height());
    T ret = 1;
    for(int i = 0; i < width(); i++) {
      int idx = -1;
      for(int j = i; j < width(); j++) {
        if(B[j][i] != 0) idx = j;
      }
      if(idx == -1) return (0);
      if(i != idx) {
        ret *= -1;
        swap(B[i], B[idx]);
      }
      ret *= B[i][i];
      T vv = B[i][i];
      for(int j = 0; j < width(); j++) {
        B[i][j] /= vv;
      }
      for(int j = i + 1; j < width(); j++) {
        T a = B[j][i];
        for(int k = 0; k < width(); k++) {
          B[j][k] -= B[i][k] * a;
        }
      }
    }
    return (ret);
  }
};


int main() {
	i64 n, A, B; scanf("%lld%lld%lld%lld", &n, &A, &B, &M);
	
	std::function<i64 (i64, i64)> powMod = [&](i64 x, i64 n) {
		i64 ret = 1;
		while(n) {
			if(n & 1) (ret *= x) %= M;
			(x *= x) %= M;
			n >>= 1;
		}
		return ret;
	};
	std::function<int (i64)> tan = [&](i64 k) {
		if(k < 0) return 0;
		i64 tmp = A + B * k;
		int ret = 0;
		while(tmp) {
			tmp /= 10LL;
			ret++;
		}
		return ret;
	};
	std::function<i64 (int)> kiri = [&](int K) {
		i64 ok = -1, ng = n;
		while(std::abs(ok - ng) > 1) {
			i64 mid = (ok + ng) >> 1;
			
			if(tan(mid) < K) ok = mid;
			else ng = mid;
		}
		return ok;
	};
	std::function<std::pair<i64, i64> (int)> getSegment = [&](int K) {
		if(tan(n - 1) < K) return std::pair<i64, i64>{-1, -1};
		
		return std::pair<i64, i64>{kiri(K) + 1, kiri(K + 1)};
	};
	
	i64 ans = 0;
	for(int k = 1; k <= 18; k++) {
		auto seg = getSegment(k);
		i64 L = seg.first, R = seg.second;
		i64 N = R - L + 1;
		if(L == -1 or N <= 0) continue;
		
		Matrix<i64> X(3, 3);
		X[0][0] = X[0][1] = X[1][1] = X[2][0] = X[2][1] = 1;
		X[2][2] = powMod(10, k);
		X ^= N;
		
		Matrix<i64> Y(3, 1);
		Y[0][0] = (A % M + B % M * (L % M - 1 + M) % M) % M;
		Y[1][0] = B % M;
		Y[2][0] = ans;
	
		ans = (X * Y)[2][0];
	}
	
	printf("%lld\n", ans);
	return 0;
}


Measured memory_bytes: 384