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;


ll 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];

ll 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:116:9: error: no match for 'operator>>' (operand types are 'std::istream' {aka 'std::basic_istream<char>'} and '__int128')
  116 |     cin >> L >> A >> B >> M;
      |     ~~~ ^~ ~
      |     |      |
      |     |      __int128
      |     std::istream {aka std::basic_istream<char>}
In file included 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/istream:170:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(bool&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  170 |       operator>>(bool& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:170:7: note:   conversion of argument 1 would be ill-formed:
a.cc:116:12: error: cannot bind non-const lvalue reference of type 'bool&' to a value of type '__int128'
  116 |     cin >> L >> A >> B >> M;
      |            ^
/usr/include/c++/14/istream:174:7: note: candidate: 'std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(short int&) [with _CharT = char; _Traits = std::char_traits<char>]' (near match)
  174 |       operator>>(short& __n);
      |       ^~~~~~~~
/usr/include/c++/14/istream:174:7: note:   conversion of argument 1 would be ill-formed:
a.cc:116:12: error: cannot bind non-const lvalue reference of type 'short int&' to a value of type '__int128'
  116 |     cin >> L >> A >> B >> M;
      |            ^
/usr/include/c++/14/istream:177:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(short unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  177 |       operator>>(unsigned short& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:177:7: note:   conversion of argument 1 would be ill-formed:
a.cc:116:12: error: cannot bind non-const lvalue reference of type 'short unsigned int&' to a value of type '__int128'
  116 |     cin >> L >> A >> B >> M;
      |            ^
/usr/include/c++/14/istream:181:7: note: candidate: 'std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(int&) [with _CharT = char; _Traits = std::char_traits<char>]' (near match)
  181 |       operator>>(int& __n);
      |       ^~~~~~~~
/usr/include/c++/14/istream:181:7: note:   conversion of argument 1 would be ill-formed:
a.cc:116:12: error: cannot bind non-const lvalue reference of type 'int&' to a value of type '__int128'
  116 |     cin >> L >> A >> B >> M;
      |            ^
/usr/include/c++/14/istream:184:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  184 |       operator>>(unsigned int& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:184:7: note:   conversion of argument 1 would be ill-formed:
a.cc:116:12: error: cannot bind non-const lvalue reference of type 'unsigned int&' to a value of type '__int128'
  116 |     cin >> L >> A >> B >> M;
      |            ^
/usr/include/c++/14/istream:188:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  188 |       operator>>(long& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:188:7: note:   conversion of argument 1 would be ill-formed:
a.cc:116:12: error: cannot bind non-const lvalue reference of type 'long int&' to a value of type '__int128'
  116 |     cin >> L >> A >> B >> M;
      |            ^
/usr/include/c++/14/istream:192:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  192 |       operator>>(unsigned long& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:192:7: note:   conversion of argument 1 would be ill-formed:
a.cc:116:12: error: cannot bind non-const lvalue reference of type 'long unsigned int&' to a value of type '__int128'
  116 |     cin >> L >> A >> B >> M;
      |            ^
/usr/include/c++/14/istream:199:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long long int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  199 |       operator>>(long long& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:199:7: note:   conversion of argument 1 would be ill-formed:
a.cc:116:12: error: cannot bind non-const lvalue reference of type 'long long int&' to a value of type '__int128'
  116 |     cin >> L >> A >> B >> M;
      |            ^
/usr/include/c++/14/istream:203:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long long unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  203 |       operator>>(unsigned long long& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:203:7: note:   conversion of argument 1 would be ill-formed:
a.cc:116:12: error: cannot bind non-const lvalue reference of type 'long long unsigned int&' to a value of type '__int128'
  116 |     cin >> L >> A >> B >> M;
      |            ^
/usr/include/c++/14/istream:219:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(float&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  219 |       operator>>(float& __f)
      |       ^~~~~~~~
/usr/include/c++/14/istream:219:7: note:   conversion of argument 1 would be ill-formed:
a.cc:116:12: error: cannot bind non-const lvalue reference of type 'float&' to a value of type '__int128'
  116 |     cin >> L >> A >> B >> M;
      |            ^
/usr/include/c++/14/istream:223:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(double&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  223 |       operator>>(double& __f)
      |       ^~~~~~~~
/usr/include/c++/14/istream:223:7: note:   conversion of argument 1 would be ill-formed:
a.cc:116:12: error: cannot bind non-const lvalue reference of type 'double&' to a value of type '__int128'
  116 |     cin >> L >> A >> B >> M;
      |            ^
/usr/include/c++/14/istream:227:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long double&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  227 |       operator>>(long double& __f)
      |       ^~~~~~~~
/usr/include/c++/14/istream:227:7: note:   conversion of argument 1 would be ill-formed:
a.cc:116:12: error: cannot bind non-const lvalue reference of type 'long double&' to a value of type '__int128'
  116 |     cin >> L >> A >> B >> M;
      |            ^
/usr/include/c++/14/istream:328:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(void*&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  328 |       operator>>(void*& __p)
      |       ^~~~~~~~
/usr/include/c++/14/istream:328:7: note:   conversion of argument 1 would be ill-formed:
a.cc:116:12: error: invalid conversion from '__int128' to 'void*' [-fpermissive]
  116 |     cin >> L >> A >> B >> M;
      |            ^
      |            |
      |            __int128
a.cc:116:12: error: cannot bind rvalue '(void*)((long int)L)' to 'void*&'
/usr/include/c++/14/istream:122:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(__istream_type& (*)(__istream_type&)) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  122 |       operator>>(__istream_type& (*__pf)(__istream_type&))
      |       ^~~~~~~~
/usr/include/c++/14/istream:122:7: note:   conversion of argument 1 would be ill-formed:
a.cc:116:12: error: invalid conversion from '__int128' to 'std::basic_istream<char>::__istream_type& (*)(std::basic_istream<char>::__istream_type&)' {aka 'std::basic_istream<char>& (*)(std::basic_istream<char>&)'} [-fpermissive]
  116 |     cin >> L >> A >> B >> M;
      |            ^
      |            |
      |            __int128
/usr/include/c++/14/istream:126:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(__ios_type& (*)(__ios_type&)) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>; __ios_type = std::basic_ios<char>]' (near match)
  126 |       operator>>(__ios_type& (*__pf)(__ios_type&))
      |       ^~~~~~~~
/usr/include/c++/14/istream:126:7: note:   conversion of argument 1 would be ill-formed:
a.cc:116:12: error: invalid conversion from '__int128' to 'std::basic_istream<char>::__ios_type& (*)(std::basic_istream<char>::__ios_type&)' {aka 'std::basic_ios<char>& (*)(std::basic_ios<char>&)'} [-fpermissive]
  116 |     cin >> L >> A >> B >> M;
      |            ^
      |            |
      |            __int128
/usr/include/c++/14/istream:133:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istre