Language: C++

#include <bits/stdc++.h>
#define F first
#define S second
#define mp make_pair
#define pb push_back
#define ll __int128
//#define ll long long
#define LEFT(a) ((a)<<1)
#define RIGHT(a) (LEFT(a) + 1)
#define MID(a,b) ((a+b)>>1)
#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))
#pragma comment(linker, "/STACK: 20000000005")
#pragma GCC optimize("Ofast")
#pragma GCC target("avx2,fma")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
using namespace std;
 
 
long long M;
ll MOD;
 
ll POWER (ll x, ll y){
    ll p = x % M, ans = 1;
    while (y){
        if ((y & 1) > 0)
            ans = ans * p % M;
        p = p * p % M;
        y /= 2;
    }
    return ans;
}
 
ll F (ll x){
    if (x == 1)
        return 1;
    ll ans = 1;
    for (ll i = 2; i * i <= x; i++){
        if (x % i != 0)
            continue;
        ll p = i, q = 1;
        x /= p;
        while (x % i == 0){
            p *= i;
            q *= i;
            x /= i;
        }
        ans = ans * (p - q);
    }
    if (x == 1)
        return ans;
    for (ll i = x; i <= x; i++){
        if (x % i != 0)
            continue;
        ll p = i, q = 1;
        x /= p;
        while (x % i == 0){
            p *= i;
            q *= i;
            x /= i;
        }
        ans = ans * (p - q);
    }
    return ans;
}
ll fi;
 
ll solve (ll A, ll B, ll n, ll x){
    //cout << A << " " << B << " " << n << " " << x << endl;
    x %= M;
    A %= M;
    B %= M;
    if (x == 0){
        return (A + n % M * B) % M;
    }
    if (x == 1){
        n %= M;
        B = B * n % M;
        if (B % 2 == 1)
            B = B + M;
        B /= 2;
        A = (A + B) % M * (n + 1) % M;
        return A;
    }
    ll C = (POWER (x, n + 1) + M - 1) % M;
    ll D = POWER (x - 1, fi - 1);
    ll ans = A * C % MOD * D % MOD;
    A = ((C * D % MOD - n - 1) % MOD + M) % M;
    A = A * B % MOD * D % MOD;
    ans = (ans + A) % MOD;
    return ans;
}
 
 
const ll N = 1e5 + 5;
 
ll T[N];
 
 
ll l[N], r[N];
 
long long L, A, B;
 
ll CC = 1;
 
main()
{
    //freopen ("in.in", "r", stdin);freopen ("out.out", "w", stdout);
    ios_base::sync_with_stdio(0);
    T[0] = 1;
    for (int i = 1; i <= 18; i++)
        T[i] = T[i - 1] * 10;
    cin >> L >> A >> B >> M;
    MOD = M;
    fi = F(M);
    for (int i = 0; i <= 17; i++){
        ll le = 0, ri = L;
        while (le < ri){
            ll mid = le + ri >> 1;
            if (A + mid * B >= T[i])
                ri = mid;
            else
                le = mid + 1;
        }
        l[i] = le;
        le = -1, ri = L - 1;
        while (le < ri){
            ll mid = le + ri + CC >> CC;
            if (A + mid * B >= T[i + 1])
                ri = mid - CC;
            else
                le = mid;
        }
        r[i] = le;
    }
    ll pas = 1;
    ll ANS = 0;
    for (ll i = 17; i >= 0; i--){
        if (l[i] > r[i])
            continue;
        ll ans = solve (A + l[i] * B, B, r[i] - l[i], T[i + 1]);
        ans = ans * pas % M;
        ANS = (ANS + ans) % M;
        pas = pas * POWER (10, (i + 1) * (r[i] - l[i] + 1)) % M;
        //cout << pas << " " << ans << " " << ANS << endl;
    }
    cout << ANS << endl;
    return 0;
}

Compiler output:
a.cc:109:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  109 | main()
      | ^~~~
a.cc: In function 'int main()':
a.cc:150:10: error: ambiguous overload for 'operator<<' (operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and '__int128')
  150 |     cout << ANS << endl;
      |     ~~~~ ^~ ~~~
      |     |       |
      |     |       __int128
      |     std::ostream {aka std::basic_ostream<char>}
In file included from /usr/include/c++/14/istream:41,
                 from /usr/include/c++/14/sstream:40,
                 from /usr/include/c++/14/complex:45,
                 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/ostream:174:7: note: candidate: 'std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char; _Traits = std::char_traits<char>; __ostream_type = std::basic_ostream<char>]'
  174 |       operator<<(long __n)
      |       ^~~~~~~~
/usr/include/c++/14/ostream:178:7: note: candidate: 'std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char; _Traits = std::char_traits<char>; __ostream_type = std::basic_ostream<char>]'
  178 |       operator<<(unsigned long __n)
      |       ^~~~~~~~
/usr/include/c++/14/ostream:182:7: note: candidate: 'std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char; _Traits = std::char_traits<char>; __ostream_type = std::basic_ostream<char>]'
  182 |       operator<<(bool __n)
      |       ^~~~~~~~
In file included from /usr/include/c++/14/ostream:1022:
/usr/include/c++/14/bits/ostream.tcc:96:5: note: candidate: 'std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char; _Traits = std::char_traits<char>]'
   96 |     basic_ostream<_CharT, _Traits>::
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/14/ostream:189:7: note: candidate: 'std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char; _Traits = std::char_traits<char>; __ostream_type = std::basic_ostream<char>]'
  189 |       operator<<(unsigned short __n)
      |       ^~~~~~~~
/usr/include/c++/14/bits/ostream.tcc:110:5: note: candidate: 'std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char; _Traits = std::char_traits<char>]'
  110 |     basic_ostream<_CharT, _Traits>::
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/14/ostream:200:7: note: candidate: 'std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char; _Traits = std::char_traits<char>; __ostream_type = std::basic_ostream<char>]'
  200 |       operator<<(unsigned int __n)
      |       ^~~~~~~~
/usr/include/c++/14/ostream:211:7: note: candidate: 'std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char; _Traits = std::char_traits<char>; __ostream_type = std::basic_ostream<char>]'
  211 |       operator<<(long long __n)
      |       ^~~~~~~~
/usr/include/c++/14/ostream:215:7: note: candidate: 'std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char; _Traits = std::char_traits<char>; __ostream_type = std::basic_ostream<char>]'
  215 |       operator<<(unsigned long long __n)
      |       ^~~~~~~~
/usr/include/c++/14/ostream:231:7: note: candidate: 'std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char; _Traits = std::char_traits<char>; __ostream_type = std::basic_ostream<char>]'
  231 |       operator<<(double __f)
      |       ^~~~~~~~
/usr/include/c++/14/ostream:235:7: note: candidate: 'std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char; _Traits = std::char_traits<char>; __ostream_type = std::basic_ostream<char>]'
  235 |       operator<<(float __f)
      |       ^~~~~~~~
/usr/include/c++/14/ostream:243:7: note: candidate: 'std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char; _Traits = std::char_traits<char>; __ostream_type = std::basic_ostream<char>]'
  243 |       operator<<(long double __f)
      |       ^~~~~~~~
/usr/include/c++/14/ostream:573:5: note: candidate: 'std::basic_ostream<_CharT, _Traits>& std::operator<<(basic_ostream<_CharT, _Traits>&, char) [with _CharT = char; _Traits = char_traits<char>]'
  573 |     operator<<(basic_ostream<_CharT, _Traits>& __out, char __c)
      |     ^~~~~~~~
/usr/include/c++/14/ostream:579:5: note: candidate: 'std::basic_ostream<char, _Traits>& std::operator<<(basic_ostream<char, _Traits>&, char) [with _Traits = char_traits<char>]'
  579 |     operator<<(basic_ostream<char, _Traits>& __out, char __c)
      |     ^~~~~~~~
/usr/include/c++/14/ostream:590:5: note: candidate: 'std::basic_ostream<char, _Traits>& std::operator<<(basic_ostream<char, _Traits>&, signed char) [with _Traits = char_traits<char>]'
  590 |     operator<<(basic_ostream<char, _Traits>& __out, signed char __c)
      |     ^~~~~~~~
/usr/include/c++/14/ostream:595:5: note: candidate: 'std::basic_ostream<char, _Traits>& std::operator<<(basic_ostream<char, _Traits>&, unsigned char) [with _Traits = char_traits<char>]'
  595 |     operator<<(basic_ostream<char, _Traits>& __out, unsigned char __c)
      |     ^~~~~~~~