Language: C++

#include <bits/stdc++.h>
using namespace std;
typedef long long   signed int LL;
typedef long long unsigned int LU;
#define incID(i, l, r) for(LL i = (l)    ; i <  (r); ++i)
#define incII(i, l, r) for(LL i = (l)    ; i <= (r); ++i)
#define decID(i, l, r) for(LL i = (r) - 1; i >= (l); --i)
#define decII(i, l, r) for(LL i = (r)    ; i >= (l); --i)
#define inc(i, n)  incID(i, 0, n)
#define inc1(i, n) incII(i, 1, n)
#define dec(i, n)  decID(i, 0, n)
#define dec1(i, n) decII(i, 1, n)
#define inID(v, l, r) ((l) <= (v) && (v) <  (r))
#define inII(v, l, r) ((l) <= (v) && (v) <= (r))
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define FI first
#define SE second
#define  ALL(v)  v.begin(),  v.end()
#define RALL(v) v.rbegin(), v.rend()
template<typename T> bool setmin  (T & a, T b) { if(b <  a) { a = b; return true; } else { return false; } }
template<typename T> bool setmax  (T & a, T b) { if(b >  a) { a = b; return true; } else { return false; } }
template<typename T> bool setmineq(T & a, T b) { if(b <= a) { a = b; return true; } else { return false; } }
template<typename T> bool setmaxeq(T & a, T b) { if(b >= a) { a = b; return true; } else { return false; } }
LL mo(LL a, LL b) { assert(b > 0); a %= b; if(a < 0) { a += b; } return a; }
LL fl(LL a, LL b) { assert(b > 0); return (a > 0 ? a / b : (a - b + 1) / b); }
LL ce(LL a, LL b) { assert(b > 0); return (a < 0 ? a / b : (a + b - 1) / b); }
template<typename T> T gcd(T a, T b) { return (b == 0 ? a : gcd(b, a % b)); }
template<typename T> T lcm(T a, T b) { return a / gcd(a, b) * b; }
#define bit(b, i) (((b) >> (i)) & 1)
#define BC __builtin_popcountll
#define SC static_cast
#define SI(v) SC<int>(v.size())
#define SL(v) SC<LL >(v.size())
#define RF(e, v) for(auto & e: v)
#define ef else if
#define UR assert(false)

// ---- ----

template<int N = 0> class ModInt {
private:
	LL v = 0;
	static LL m;
public:
	ModInt() { }
	ModInt(LL vv) { setval(vv); }
	ModInt & setval(LL vv) { v = vv % m; if(v < 0) { v += m; } return (*this); }
	static void setmod(LL mm) { m = mm; }
	LL getval() const { return v; }
	ModInt & operator+=(const ModInt & b)       { return setval(v + b.v); }
	ModInt & operator-=(const ModInt & b)       { return setval(v - b.v); }
	ModInt & operator*=(const ModInt & b)       { return setval(v * b.v); }
	ModInt & operator/=(const ModInt & b)       { return setval(v * b.inv()); }
	ModInt & operator^=(            LU b)       { return setval(ex(v, b)); }
	ModInt   operator+ (                ) const { return ModInt(+v); }
	ModInt   operator- (                ) const { return ModInt(-v); }
	ModInt   operator+ (const ModInt & b) const { return ModInt(v + b.v); }
	ModInt   operator- (const ModInt & b) const { return ModInt(v - b.v); }
	ModInt   operator* (const ModInt & b) const { return ModInt(v * b.v); }
	ModInt   operator/ (const ModInt & b) const { return ModInt(v * b.inv()); }
	ModInt   operator^ (            LU b) const { return ModInt(ex(v, b)); }
	LL inv() const {
		LL x = (ex_gcd(v, m).FI + m) % m;
		assert(v * x % m == 1);
		return x;
	}
	LL ex(LL a, LU b) const {
		LL D = 64, x[64], y = 1;
		inc(i, D) { if((b >> i) == 0) { D = i; break; } }
		inc(i, D) { x[i] = (i == 0 ? a : x[i - 1] * x[i - 1]) % m; }
		inc(i, D) { if((b >> i) & 1) { (y *= x[i]) %= m; } }
		return y;
	}
	pair<LL, LL> ex_gcd(LL a, LL b) const {
		if(b == 0) { return MP(1, 0); }
		auto p = ex_gcd(b, a % b);
		return MP(p.SE, p.FI - (a / b) * p.SE);
	}
};
template<int N> LL ModInt<N>::m;
template<int N> ModInt<N> operator+(LL a, const ModInt<N> & b) { return  b + a; }
template<int N> ModInt<N> operator-(LL a, const ModInt<N> & b) { return -b + a; }
template<int N> ModInt<N> operator*(LL a, const ModInt<N> & b) { return  b * a; }
template<int N> ModInt<N> operator/(LL a, const ModInt<N> & b) { return  a * b.inv(); }
template<int N> istream & operator>>(istream & is, ModInt<N> & b) { LL v; is >> v; b.setval(v); return is; }
template<int N> ostream & operator<<(ostream & os, const ModInt<N> & b) { return (os << b.getval()); }

// ---- ----

template<typename T, int N> struct Matrix {
	vector<vector<T>> a;
	Matrix(const vector<vector<T>> & v = { }) { init(v); }
	void init(const vector<vector<T>> & v) {
		a = vector<vector<T>>(N, vector<T>(N, 0));
		assert(v.size() <= N);
		inc(i, v.size()) { assert(v[i].size() <= N);
		inc(j, v[i].size()) {
			a[i][j] = v[i][j];
		}
		}
	}
	vector<T> & operator[](int i) { return a[i]; }
	Matrix id() {
		Matrix e;
		inc(i, N) { e[i][i] = 1; }
		return e;
	}
	Matrix tp() {
		Matrix b;
		inc(i, N) {
		inc(j, N) {
			b[j][i] = a[i][j];
		}
		}
		return b;
	}
	Matrix & operator+=(const Matrix & b) {
		inc(i, N) {
		inc(j, N) {
			a[i][j] += b.a[i][j];
		}
		}
		return (*this);
	}
	Matrix & operator*=(T b) {
		inc(i, N) {
		inc(j, N) {
			a[i][j] *= b;
		}
		}
		return (*this);
	}
	Matrix & operator*=(const Matrix & b) {
		Matrix c;
		inc(i, N) {
		inc(j, N) {
		inc(k, N) {
			c[i][j] += a[i][k] * b.a[k][j];
		}
		}
		}
		return (*this) = c;
	}
	Matrix & operator^=(LU b) {
		Matrix t[64], c = id();
		int D = 64;
		inc(i, D) { if((b >> i) == 0) { D = i; break; } }
		inc(i, D) { t[i] = (i == 0 ? (*this) : t[i - 1] * t[i - 1]); }
		inc(i, D) { if((b >> i) & 1) { c *= t[i]; } }
		return (*this) = c;
	}
	Matrix operator+(const Matrix & b) const { Matrix c = a; return c += b; }
	Matrix operator*(             T b) const { Matrix c = a; return c *= b; }
	Matrix operator*(const Matrix & b) const { Matrix c = a; return c *= b; }
	Matrix operator^(            LU b) const { Matrix c = a; return c ^= b; }
};
template<typename T, int N> Matrix<T, N> operator*(T a, const Matrix<T, N> & b) { return b * a; }
template<typename T, int N> ostream & operator<<(ostream & os, const Matrix<T, N> & m) {
	inc(i, N) {
	inc(j, N) {
		os << m.a[i][j] << " ";
	} os << endl;
	}
	return os;
}

// ---- ----

typedef ModInt<> MI;

LL n, a, b, m, p[20];

int main() {
	cin >> n >> a >> b >> m;
	
	LL v = 1;
	inc1(i, 18) {
		LL v *= 10;
		
		p[i] = (v < a ? 0 : (v - a) / b);
		setmin(p[i], n);
	}
	p[19] = n;
	
	MI::setmod(m);
	MI ans = 0;
	inc1(d, 18) {
		LL c = -d;
		incII(j, d, 18) { c += j * (p[j + 1] - p[j]); }
		Matrix<MI, 4> A({
			{ 1, 0, MI(10) ^ d, 0 }, 
			{ 0, 1, 0, -d }, 
			{ 0, 0, 1, b }, 
			{ 0, 0, 0, 1 }
		}), V({ 0, , a + b * (p[d]), 1 });
		
		ans += ((a ^ (p[d + 1] - p[d])) * V)[0][0];
	}
	
	cout << ans << endl;
	
	return 0;
}


Compiler output:
a.cc: In function 'int main()':
a.cc:180:22: error: expected initializer before '*=' token
  180 |                 LL v *= 10;
      |                      ^~
a.cc:197:28: error: expected primary-expression before ',' token
  197 |                 }), V({ 0, , a + b * (p[d]), 1 });
      |                            ^
a.cc:197:49: error: no matching function for call to 'Matrix<ModInt<>, 4>::Matrix(<brace-enclosed initializer list>)'
  197 |                 }), V({ 0, , a + b * (p[d]), 1 });
      |                                                 ^
a.cc:94:9: note: candidate: 'Matrix<T, N>::Matrix(const std::vector<std::vector<_Tp> >&) [with T = ModInt<>; int N = 4]'
   94 |         Matrix(const vector<vector<T>> & v = { }) { init(v); }
      |         ^~~~~~
a.cc:94:42: note:   no known conversion for argument 1 from '<brace-enclosed initializer list>' to 'const std::vector<std::vector<ModInt<>, std::allocator<ModInt<> > >, std::allocator<std::vector<ModInt<>, std::allocator<ModInt<> > > > >&'
   94 |         Matrix(const vector<vector<T>> & v = { }) { init(v); }
      |                ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
a.cc:92:36: note: candidate: 'Matrix<ModInt<>, 4>::Matrix(const Matrix<ModInt<>, 4>&)'
   92 | template<typename T, int N> struct Matrix {
      |                                    ^~~~~~
a.cc:92:36: note:   no known conversion for argument 1 from '<brace-enclosed initializer list>' to 'const Matrix<ModInt<>, 4>&'
a.cc:92:36: note: candidate: 'Matrix<ModInt<>, 4>::Matrix(Matrix<ModInt<>, 4>&&)'
a.cc:92:36: note:   no known conversion for argument 1 from '<brace-enclosed initializer list>' to 'Matrix<ModInt<>, 4>&&'
a.cc:199:49: error: no match for 'operator*' (operand types are 'LL' {aka 'long long int'} and 'Matrix<ModInt<>, 4>')
  199 |                 ans += ((a ^ (p[d + 1] - p[d])) * V)[0][0];
      |                         ~~~~~~~~~~~~~~~~~~~~~~~ ^ ~
      |                            |                      |
      |                            LL {aka long long int} Matrix<ModInt<>, 4>
a.cc:85:27: note: candidate: 'template<int N> ModInt<N> operator*(LL, const ModInt<N>&)'
   85 | template<int N> ModInt<N> operator*(LL a, const ModInt<N> & b) { return  b * a; }
      |                           ^~~~~~~~
a.cc:85:27: note:   template argument deduction/substitution failed:
a.cc:199:51: note:   'Matrix<ModInt<>, 4>' is not derived from 'const ModInt<N>'
  199 |                 ans += ((a ^ (p[d + 1] - p[d])) * V)[0][0];
      |                                                   ^
a.cc:159:42: note: candidate: 'template<class T, int N> Matrix<T, N> operator*(T, const Matrix<T, N>&)'
  159 | template<typename T, int N> Matrix<T, N> operator*(T a, const Matrix<T, N> & b) { return b * a; }
      |                                          ^~~~~~~~
a.cc:159:42: note:   template argument deduction/substitution failed:
a.cc:199:51: note:   deduced conflicting types for parameter 'T' ('long long int' and 'ModInt<>')
  199 |                 ans += ((a ^ (p[d + 1] - p[d])) * V)[0][0];
      |                                                   ^
In file included from /usr/include/c++/14/ccomplex:39,
                 from /usr/include/x86_64-linux-gnu/c++/14/bits/stdc++.h:127,
                 from a.cc:1:
/usr/include/c++/14/complex:400:5: note: candidate: 'template<class _Tp> std::complex<_Tp> std::operator*(const complex<_Tp>&, const complex<_Tp>&)'
  400 |     operator*(const complex<_Tp>& __x, const complex<_Tp>& __y)
      |     ^~~~~~~~
/usr/include/c++/14/complex:400:5: note:   template argument deduction/substitution failed:
a.cc:199:51: note:   mismatched types 'const std::complex<_Tp>' and 'LL' {aka 'long long int'}
  199 |                 ans += ((a ^ (p[d + 1] - p[d])) * V)[0][0];
      |                                                   ^
/usr/include/c++/14/complex:409:5: note: candidate: 'template<class _Tp> std::complex<_Tp> std::operator*(const complex<_Tp>&, const _Tp&)'
  409 |     operator*(const complex<_Tp>& __x, const _Tp& __y)
      |     ^~~~~~~~
/usr/include/c++/14/complex:409:5: note:   template argument deduction/substitution failed:
a.cc:199:51: note:   mismatched types 'const std::complex<_Tp>' and 'LL' {aka 'long long int'}
  199 |                 ans += ((a ^ (p[d + 1] - p[d])) * V)[0][0];
      |                                                   ^
/usr/include/c++/14/complex:418:5: note: candidate: 'template<class _Tp> std::complex<_Tp> std::operator*(const _Tp&, const complex<_Tp>&)'
  418 |     operator*(const _Tp& __x, const complex<_Tp>& __y)
      |     ^~~~~~~~
/usr/include/c++/14/complex:418:5: note:   template argument deduction/substitution failed:
a.cc:199:51: note:   'Matrix<ModInt<>, 4>' is not derived from 'const std::complex<_Tp>'
  199 |                 ans += ((a ^ (p[d + 1] - p[d])) * V)[0][0];
      |                                                   ^
In file included from /usr/include/c++/14/valarray:605,
                 from /usr/include/x86_64-linux-gnu/c++/14/bits/stdc++.h:166:
/usr/include/c++/14/bits/valarray_after.h:407:5: note: candidate: 'template<class _Dom1, class _Dom2> std::_Expr<std::__detail::_BinClos<std::__multiplies, std::_Expr, std::_Expr, _Dom1, _Dom2>, typename std::__fun<std::__multiplies, typename _Dom1::value_type>::result_type> std::operator*(const _Expr<_Dom1, typename _Dom1::value_type>&, const _Expr<_Dom2, typename _Dom2::value_type>&)'
  407 |     _DEFINE_EXPR_BINARY_OPERATOR(*, struct std::__multiplies)
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/14/bits/valarray_after.h:407:5: note:   template argument deduction/substitution failed:
a.cc:199:51: note:   mismatched types 'const std::_Expr<_Dom1, typename _Dom1::value_type>' and 'LL' {aka 'long long int'}
  199 |                 ans += ((a ^ (p[d + 1] - p[d])) * V)[0][0];
      |                                                   ^
/usr/include/c++/14/bits/valarray_after.h:407:5: note: candidate: 'template<class _Dom> std::_Expr<std::__detail::_BinClos<std::__multiplies, std::_Expr, std::_Constant, _Dom, typename _Dom::value_type>, typename std::__fun<std::__multiplies, typename _Dom1::value_type>::result_type> std::operator*(const _Expr<_Dom1, typename _Dom1::value_type>&, const typename _Dom::value_type&)'
  407 |     _DEFINE_EXPR_BINARY_OPERATOR(*, struct std::__multiplies)
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/14/bits/valarray_after.h:407:5: note:   template argument deduction/substitution failed:
a.cc:199:51: note:   mismatched types 'const std::_Expr<_Dom1, typename _Dom1::value_type>' and 'LL' {aka 'long long int'}
  199 |                 ans += ((a ^ (p[d + 1] - p[d])) * V)[0][0];
      |                                                   ^
/usr/include/c++/14/bits/valarray_after.h:407:5: note: candidate: 'template<class _Dom> std::_Expr<std::__detail::_BinClos<std::__multiplies, std::_Constant, std::_Expr, typename _Dom::value_type, _Dom>, typename std::__fun<std::__multiplies, typename _Dom1::value_type>::result_type> std::operator*(const typename _Dom::value_type&, const _Expr<_Dom1, typename _Dom1::value_type>&)'
  407 |     _DEFINE_EXPR_BINARY_OPERATOR(*, struct std::__multiplies)
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/14/bits/valarray_after.h:407:5: note:   template argument deduction/substitution failed:
a.cc:199:51: note:   'Matrix<ModInt<>, 4>' is not derived from 'const std::_Expr<_Dom1, typename _Dom1::value_type>'
  199 |                 ans += ((a ^ (p[d + 1] - p[d])) * V)[0][0];
      |                                                   ^
/usr/include/c++/14/bits/valarray_after.h:407:5: note: candidate: 'template<class _Dom> std::_Expr<std::__detail::_BinClos<std::__multiplies, std::_Expr, std::_ValArray, _Dom, typename _Dom::value_type>, typename std::__fun<std::__multiplies, typename _Dom1::value_type>::result_type> std::operator*(const _Expr<_Dom1, typename _Dom1::value_type>&, const valarray<typename _Dom::value_type>&)'
  407 |     _DEFINE_EXPR_BINARY_OPERATOR(*, struct std::__multiplies)
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/14/bits/valarray_after.h:407:5: note:   template argument deduction/substitution failed:
a.cc:199:51: note:   mismatched types 'const std::_Expr<_Dom1, typename _Dom1::value_type>' and 'LL' {aka 'long long int'}
  199 |                 ans += ((a ^ (p[d + 1] - p[d])) * V)[0][0];
      |                                                   ^
/usr/include/c++/14/bits/valarray_after.h:407:5: note: candidate: 'template<class _Dom> std::_Expr<std::__detail::_BinClos<std::__multiplies, std::_ValArray, std::_Expr, typename _Dom::value_type, _Dom>, typename std::__fun<std::__multiplies, typename _Dom1::value_type>::result_type> std::operator*(const valarray<typename _Dom::value_type>&, const _Expr<_Dom1, typename _Dom1::value_type>&)'
  407 |     _DEFINE_EXPR_BINARY_OPERATOR(*, struct std::__multiplies)
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/14/bits/valarray_after.h:407:5: note:   template argument deduction/substitution failed:
a.cc:199:51: note:   'Matrix<ModInt<>, 4>' is not derived from 'const std::_Expr<_Dom1, typename _Dom1::value_type>'
  199 |                 ans += ((a ^ (p[d + 1] - p[d])) * V)[0][0];
      |                                                   ^
/usr/include/c++/14/valarray:1198:1: note: candidate: 'template<class _Tp> std::_Expr<std::__detail::_BinClos<std::__multiplies, std::_ValArray, std::_ValArray, _Tp, _Tp>, typename std::__fun<std::__multiplies, _Tp>::result_type> std::operator*(const valarray<_Tp>&, const valarray<_Tp>&)'
 1198 | _DEFINE_BINARY_OPERATOR(*, __multiplies)
      | ^~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/14/valarray:1198:1: note:   template argument deduction/substitution failed:
a.cc:199:51: note:   mismatched types 'const std::valarray<_Tp>' and 'LL' {aka 'long long int'}
  199 |                 ans += ((a ^ (p[d + 1] - p[d])) * V)[0][0];
      |                                                   ^
/usr/include/c++/14/valarray:1198:1: note: candidate: 'template<class _Tp> std::_Expr<std::__detail::_BinClos<std::__multiplies, std::_ValArray, std::_Constant, _Tp, _Tp>, typename std::__fun<std::__multiplies, _Tp>::result_type> std::operator*