Problem p02757 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
// #define P pair<ll,ll>
#define FOR(I, A, B) for (ll I = ll(A); I < ll(B); ++I)
#define FORR(I, A, B) for (ll I = ll((B)-1); I >= ll(A); --I)
#define TO(x, t, f) ((x) ? (t) : (f))
#define SORT(x) (sort(x.begin(), x.end())) // 0 2 2 3 4 5 8 9
#define POSL(x, v)                                                             \
  (lower_bound(x.begin(), x.end(), v) - x.begin()) // xi>=v  x is sorted
#define POSU(x, v)                                                             \
  (upper_bound(x.begin(), x.end(), v) - x.begin()) // xi>v  x is sorted
#define NUM(x, v) (POSU(x, v) - POSL(x, v))        // x is sorted
#define REV(x) (reverse(x.begin(), x.end()))       // reverse
ll gcd(ll a, ll b) {
  if (a % b == 0)
    return b;
  return gcd(b, a % b);
}
ll lcm(ll a, ll b) {
  ll c = gcd(a, b);
  return ((a / c) * (b / c) * c);
}
#define NEXTP(x) next_permutation(x.begin(), x.end())
const ll INF = ll(1e16) + ll(7);
const ll MOD = 1000000007LL;
#define out(a) cout << fixed << setprecision((a))
// tie(a,b,c) = make_tuple(10,9,87);
#define pop(a) __builtin_popcount((a))
ll keta(ll a) {
  ll r = 0;
  while (a) {
    a /= 10;
    r++;
  }
  return r;
}

ll calc(ll a, ll b, ll p) { // a^(b) mod p
  if (b == 0)
    return 1;
  ll y = calc(a, b / 2, p);
  y = (y * y) % p;
  if (b & 1)
    y = (y * a) % p;
  return y;
}

int main() {
  ll N, P, ans = 0;
  cin >> N >> P;
  string S;
  cin >> S;

  if (P == 5 || P == 2) {
    P = 0;
    int x = 8 / P;
  }

  map<ll, ll> ma;
  ll x = 0;

  // ma[0] = 1;
  FOR(i, 0, N) {
    x *= 10;
    x += S[i] - '0';
    x %= P;
    ll k = x * calc(calc(10, i, P), P - 2, P) % P;
    ans += ma[k];
    ma[k]++;
    if (x == 0)
      ans++;
  }
  cout << ans << endl;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
// #define P pair<ll,ll>
#define FOR(I, A, B) for (ll I = ll(A); I < ll(B); ++I)
#define FORR(I, A, B) for (ll I = ll((B)-1); I >= ll(A); --I)
#define TO(x, t, f) ((x) ? (t) : (f))
#define SORT(x) (sort(x.begin(), x.end())) // 0 2 2 3 4 5 8 9
#define POSL(x, v)                                                             \
  (lower_bound(x.begin(), x.end(), v) - x.begin()) // xi>=v  x is sorted
#define POSU(x, v)                                                             \
  (upper_bound(x.begin(), x.end(), v) - x.begin()) // xi>v  x is sorted
#define NUM(x, v) (POSU(x, v) - POSL(x, v))        // x is sorted
#define REV(x) (reverse(x.begin(), x.end()))       // reverse
ll gcd(ll a, ll b) {
  if (a % b == 0)
    return b;
  return gcd(b, a % b);
}
ll lcm(ll a, ll b) {
  ll c = gcd(a, b);
  return ((a / c) * (b / c) * c);
}
#define NEXTP(x) next_permutation(x.begin(), x.end())
const ll INF = ll(1e16) + ll(7);
const ll MOD = 1000000007LL;
#define out(a) cout << fixed << setprecision((a))
// tie(a,b,c) = make_tuple(10,9,87);
#define pop(a) __builtin_popcount((a))
ll keta(ll a) {
  ll r = 0;
  while (a) {
    a /= 10;
    r++;
  }
  return r;
}

ll calc(ll a, ll b, ll p) { // a^(b) mod p
  if (b == 0)
    return 1;
  ll y = calc(a, b / 2, p);
  y = (y * y) % p;
  if (b & 1)
    y = (y * a) % p;
  return y;
}

int main() {
  ll N, P, ans = 0;
  cin >> N >> P;
  string S;
  cin >> S;

  if (P == 5) {
    FOR(i, 0, N) {
      if (S[i] == '5' || S[i] == '0') {
        ans += i + 1;
      }
    }
    cout << ans << endl;
    return 0;
  }
  if (P == 2) {
    FOR(i, 0, N) {
      if ((S[i] - '0') % 2 == 0) {
        ans += i + 1;
      }
    }
    cout << ans << endl;
    return 0;
  }

  map<ll, ll> ma;
  ll x = 0;

  // ma[0] = 1;
  FOR(i, 0, N) {
    x *= 10;
    x += S[i] - '0';
    x %= P;
    ll k = x * calc(calc(10, i, P), P - 2, P) % P;
    ans += ma[k];
    ma[k]++;
    if (x == 0)
      ans++;
  }
  cout << ans << endl;
}