Problem p02702 (C++) — buggy submission, verdict: Time Limit Exceeded

// /*
//   GOOD is not Enough
//   You've got to be GREAT.
// */
// #include<bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// // #include<boost/multiprecision/cpp_int.hpp>
// // using namespace boost::multiprecision;
// using namespace __gnu_pbds;
// using namespace std;
// #define int long long
// #define mod 1000000007
// #define FAST ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
// #define f(i,n) for(int i=0;i<n;i++)
// #define fp(i,k,n) for(int i=k;i<=n;i++)
// #define fr(i,k,n) for(int i=k;i>=n;i--)
// #define pb push_back
// #define pii pair<int,int>
// #define dbg(x) cout << (#x) << " is " << (x) << '\\n'
// #define F first
// #define S second
// #define all(a) a.begin(),a.end()
// typedef
// tree<int,null_type,less_equal<int>,rb_tree_tag,tree_order_statistics_node_update>ordered_set;
#pragma GCC optimize("O3")
#pragma GCC target("sse4")

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;

typedef pair<int, int> pi;
typedef pair<ll, ll> pl;
typedef pair<ld, ld> pd;

typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;

template <class T>
using Tree =
    tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

#define FOR(i, a, b) for (int i = a; i < (b); i++)
#define F0R(i, a) for (int i = 0; i < (a); i++)
#define FORd(i, a, b) for (int i = (b)-1; i >= a; i--)
#define F0Rd(i, a) for (int i = (a)-1; i >= 0; i--)

#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int MOD = 1000000007;
const ll INF = 1e18;
const int MX = 100001; // check the limits, dummy

ll modExp(ll base, ll power) {
  if (power == 0) {
    return 1;
  } else {
    ll cur = modExp(base, power / 2);
    cur = cur * cur;
    cur = cur % MOD;
    if (power % 2 == 1)
      cur = cur * base;
    cur = cur % MOD;
    return cur;
  }
}

ll inv(ll base) {
  int g = MOD, r = base, x = 0, y = 1;
  while (r != 0) {
    int q = g / r;
    g %= r;
    swap(g, r);
    x -= q * y;
    swap(x, y);
  }
  return x < 0 ? x + MOD : x;
}

ll mul(ll A, ll B) { return (A * B) % MOD; }

ll add(ll A, ll B) { return (A + B) % MOD; }

ll dvd(ll A, ll B) { return mul(A, inv(B)); }

ll sub(ll A, ll B) { return (A - B + MOD) % MOD; }
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int N;
  int P;
  P = 2019;
  string S;
  cin >> S;
  N = S.length();

  ll counts[P];
  F0R(i, P) counts[i] = 0;
  counts[0] = 1;
  int cur = 0;
  MOD = P;
  F0R(i, N) {
    cur *= 10;
    cur += S[i] - '0';
    cur %= MOD;
    int val = modExp(10, N - 1 - i) * cur;
    val %= MOD;
    counts[val]++;
  }

  ll ans = 0;
  F0R(i, P) ans += (counts[i] * (counts[i] - 1)) / 2;

  cout << ans << endl;

  return 0;
}


Error: TLE

Fixed submission:

/*
  GOOD is not Enough
  You've got to be GREAT.
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
// #include<boost/multiprecision/cpp_int.hpp>
// using namespace boost::multiprecision;
using namespace __gnu_pbds;
using namespace std;
#define int long long
#define mod 1000000007
#define FAST ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
#define f(i, n) for (int i = 0; i < n; i++)
#define fp(i, k, n) for (int i = k; i <= n; i++)
#define fr(i, k, n) for (int i = k; i >= n; i--)
#define pb push_back
#define pii pair<int, int>
#define dbg(x) cout << (#x) << " is " << (x) << '\\n'
#define F first
#define S second
#define all(a) a.begin(), a.end()
typedef tree<int, null_type, less_equal<int>, rb_tree_tag,
             tree_order_statistics_node_update>
    ordered_set;

void solve() {
  string s;
  cin >> s;
  int n = s.length();
  map<pii, int> seen;
  int ans = 0;
  f(i, n) {
    int rem = 0;
    int pre = 0;
    fp(j, i, n - 1) {
      rem = (10 * rem + (s[j] - '0')) % 2019;
      if (seen[{j, rem}] == 1)
        break;
      else
        seen[{j, rem}] = 1;
      if (rem == 0)
        pre++;
    }
    ans += ((pre * (pre + 1)) / 2);
  }
  cout << ans << '\\n';
  return;
}

signed main() {
  FAST int T = 1;
  //  cin >> T;
  while (T--) {
    solve();
  }
  return 0;
}