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

#define _USE_MATH_DEFINES
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING
#define _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS
#define _CRT_SECURE_NO_WARNINGS

#pragma GCC target("avx")
// #include <bits/stdc++.h>

#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <fstream>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

#include <emmintrin.h>
#include <mmintrin.h>
#include <nmmintrin.h>

using namespace std;

#define dprint(Exp, ...)                                                       \\
  if (Exp) {                                                                   \\
    fprintf(stderr, __VA_ARGS__);                                              \\
  }
#define printe(...) fprintf(stderr, __VA_ARGS__);
// #define printe(...) void();
#define printE(...) fprintf(stderr, __VA_ARGS__);
// #define printE(...) void();

#define PrtExp(_Exp) cerr << #_Exp << " = " << (_Exp)
#define PrtExpN(_Exp) cerr << #_Exp << " = " << (_Exp) << "\\n"

#define SINT(n) scanf("%d", &n)
#define SINT2(n, m) scanf("%d %d", &n, &m)
#define SINT3(n, m, o) scanf("%d %d %d", &n, &m, &o)
#define SINT4(n, m, o, P) scanf("%d %d %d %d", &n, &m, &o, &P)
#define SINT5(n, m, o, P, q) scanf("%d %d %d %d %d", &n, &m, &o, &P, &q)
#define SLL(n) scanf("%lld", &n)
#define SLL2(n, m) scanf("%lld %lld", &n, &m)
#define SLL3(n, m, o) scanf("%lld %lld %lld", &n, &m, &o)
#define SST(s) scanf("%s", s)
#define SCH(c) scanf("%c", &c)

#define GC() getchar()

#define PINT(n) printf("%d", (int)(n))
#define PINT2(n, m) printf("%d %d", (int)(n), (int)(m))
#define PINT3(n, m, l) printf("%d %d %d", (int)(n), (int)(m), (int)(l))
#define PLL(n) printf("%lld", (long long)(n))
#define PST(s) printf("%s", (s))
#define PCH(s) printf("%c", (s))

#define PINTN(n) printf("%d\\n", (int)(n))
#define PINT2N(n, m) printf("%d %d\\n", (int)(n), (int)(m))
#define PINT3N(n, m, l) printf("%d %d %d\\n", (int)(n), (int)(m), (int)(l))
#define PLLN(n) printf("%lld\\n", (long long)(n))
#define PSTN(s) printf("%s\\n", (s))
#define PCHN(s) printf("%c\\n", (s))

#define PSP() printf(" ")
#define PN() printf("\\n")

#define PC(c) putchar(c)
#define CSP (' ')
#define SN ("\\n")

#define rep(i, a) for (int i = 0; i < a; i++)
#define reP(i, a) for (int i = 0; i <= a; i++)
#define Rep(i, a) for (int i = a - 1; i >= 0; i--)
#define ReP(i, a) for (int i = a; i >= 0; i--)

#define rEp(i, a) for (i = 0; i < a; i++)
#define rEP(i, a) for (i = 0; i <= a; i++)
#define REp(i, a) for (i = a - 1; i >= 0; i--)
#define REP(i, a) for (i = a; i >= 0; i--)

#define repft(i, a, b) for (int i = a; i < b; i++)
#define repfT(i, a, b) for (int i = a; i <= b; i++)
#define Repft(i, a, b) for (int i = a - 1; i >= b; i--)
#define RepfT(i, a, b) for (int i = a; i >= b; i--)

#define foreach(a, it) for (auto it = a.begin(); it != a.end(); ++it)

#define FILL(a, v) fill(begin(a), end(a), v)
#define FILL0(a) memset(a, 0, sizeof(a))
#define FILL1(a) memset(a, -1, sizeof(a))

typedef long long ll;

typedef unsigned long long ull;
typedef pair<int, int> Pi;
typedef pair<ll, ll> Pll;

const int INF = 1'010'000'000;         // 0x3C33'6080
const ll INFLL = 0x1f1f1f1f1f1f1f1fLL; // 2,242,545,357,980,376,863

template <class A, class B>
inline ostream &operator<<(ostream &st, const pair<A, B> &P) {
  return st << "(" << P.first << "," << P.second << ")";
};
template <class A, class B>
inline pair<A, B> operator+(const pair<A, B> &P, const pair<A, B> &Q) {
  return pair<A, B>(P.first + Q.first, P.second + Q.second);
};
template <class A, class B>
inline pair<A, B> operator-(const pair<A, B> &P, const pair<A, B> &Q) {
  return pair<A, B>(P.first - Q.first, P.second - Q.second);
};

#define fs first
#define sc second

int bitCount(unsigned long long bits) {
#if _MSC_VER >= 1920 || __INTEL_COMPILER
  return _mm_popcnt_u64(bits);
#else
  return __builtin_popcountll(bits);
#endif
}
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }

int cnt[20][20];

int main() {
  int n;
  cin >> n;

  const ll E9 = 1000000000;

  ll ret = 0;
  rep(i, n) {
    string s;
    cin >> s;
    ll a = 0;
    int j = 0;
    int k = 9;
    for (; j < s.size(); ++j) {
      if (s[j] == '.') {
        break;
      }
      a = a * 10 + s[j] - '0';
    }
    if (j != s.size()) {
      for (++j; j < s.size(); ++j) {
        a = a * 10 + s[j] - '0';
        --k;
      }
    }
    rep(_, k) a *= 10;
    int m2 = 0;
    int m5 = 0;
    while (a % 2 == 0) {
      m2++;
      a /= 2;
    }
    while (a % 5 == 0) {
      m5++;
      a /= 5;
    }

    // printe("[%d %d] %lld\\n", m2, m5, a);

    rep(a, 20) rep(b, 20) {
      if (a + m2 < 18)
        continue;
      if (b + m5 < 18)
        continue;
      ret += cnt[a][b];
      // if (cnt[a][b] > 0) printe("%d %d (%d)\\n", a, b, cnt[a][b]);
    }
    cnt[min(m2, 18)][min(m5, 18)]++;

    // printe("[%d,%d]\\n", m2, m5);
    // if (m2 * 2 >= 9 && m5 * 2 >= 9) ret--;
  }

  cout << ret << endl;
}


Error: TLE

Fixed submission:

#define _USE_MATH_DEFINES
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING
#define _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS
#define _CRT_SECURE_NO_WARNINGS

#pragma GCC target("avx")
// #include <bits/stdc++.h>

#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <fstream>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

#include <emmintrin.h>
#include <mmintrin.h>
#include <nmmintrin.h>

using namespace std;

#define dprint(Exp, ...)                                                       \\
  if (Exp) {                                                                   \\
    fprintf(stderr, __VA_ARGS__);                                              \\
  }
#define printe(...) fprintf(stderr, __VA_ARGS__);
// #define printe(...) void();
#define printE(...) fprintf(stderr, __VA_ARGS__);
// #define printE(...) void();

#define PrtExp(_Exp) cerr << #_Exp << " = " << (_Exp)
#define PrtExpN(_Exp) cerr << #_Exp << " = " << (_Exp) << "\\n"

#define SINT(n) scanf("%d", &n)
#define SINT2(n, m) scanf("%d %d", &n, &m)
#define SINT3(n, m, o) scanf("%d %d %d", &n, &m, &o)
#define SINT4(n, m, o, P) scanf("%d %d %d %d", &n, &m, &o, &P)
#define SINT5(n, m, o, P, q) scanf("%d %d %d %d %d", &n, &m, &o, &P, &q)
#define SLL(n) scanf("%lld", &n)
#define SLL2(n, m) scanf("%lld %lld", &n, &m)
#define SLL3(n, m, o) scanf("%lld %lld %lld", &n, &m, &o)
#define SST(s) scanf("%s", s)
#define SCH(c) scanf("%c", &c)

#define GC() getchar()

#define PINT(n) printf("%d", (int)(n))
#define PINT2(n, m) printf("%d %d", (int)(n), (int)(m))
#define PINT3(n, m, l) printf("%d %d %d", (int)(n), (int)(m), (int)(l))
#define PLL(n) printf("%lld", (long long)(n))
#define PST(s) printf("%s", (s))
#define PCH(s) printf("%c", (s))

#define PINTN(n) printf("%d\\n", (int)(n))
#define PINT2N(n, m) printf("%d %d\\n", (int)(n), (int)(m))
#define PINT3N(n, m, l) printf("%d %d %d\\n", (int)(n), (int)(m), (int)(l))
#define PLLN(n) printf("%lld\\n", (long long)(n))
#define PSTN(s) printf("%s\\n", (s))
#define PCHN(s) printf("%c\\n", (s))

#define PSP() printf(" ")
#define PN() printf("\\n")

#define PC(c) putchar(c)
#define CSP (' ')
#define SN ("\\n")

#define rep(i, a) for (int i = 0; i < a; i++)
#define reP(i, a) for (int i = 0; i <= a; i++)
#define Rep(i, a) for (int i = a - 1; i >= 0; i--)
#define ReP(i, a) for (int i = a; i >= 0; i--)

#define rEp(i, a) for (i = 0; i < a; i++)
#define rEP(i, a) for (i = 0; i <= a; i++)
#define REp(i, a) for (i = a - 1; i >= 0; i--)
#define REP(i, a) for (i = a; i >= 0; i--)

#define repft(i, a, b) for (int i = a; i < b; i++)
#define repfT(i, a, b) for (int i = a; i <= b; i++)
#define Repft(i, a, b) for (int i = a - 1; i >= b; i--)
#define RepfT(i, a, b) for (int i = a; i >= b; i--)

#define foreach(a, it) for (auto it = a.begin(); it != a.end(); ++it)

#define FILL(a, v) fill(begin(a), end(a), v)
#define FILL0(a) memset(a, 0, sizeof(a))
#define FILL1(a) memset(a, -1, sizeof(a))

typedef long long ll;

typedef unsigned long long ull;
typedef pair<int, int> Pi;
typedef pair<ll, ll> Pll;

const int INF = 1'010'000'000;         // 0x3C33'6080
const ll INFLL = 0x1f1f1f1f1f1f1f1fLL; // 2,242,545,357,980,376,863

template <class A, class B>
inline ostream &operator<<(ostream &st, const pair<A, B> &P) {
  return st << "(" << P.first << "," << P.second << ")";
};
template <class A, class B>
inline pair<A, B> operator+(const pair<A, B> &P, const pair<A, B> &Q) {
  return pair<A, B>(P.first + Q.first, P.second + Q.second);
};
template <class A, class B>
inline pair<A, B> operator-(const pair<A, B> &P, const pair<A, B> &Q) {
  return pair<A, B>(P.first - Q.first, P.second - Q.second);
};

#define fs first
#define sc second

int bitCount(unsigned long long bits) {
#if _MSC_VER >= 1920 || __INTEL_COMPILER
  return _mm_popcnt_u64(bits);
#else
  return __builtin_popcountll(bits);
#endif
}
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }

int cnt[20][20];

int main() {
  int n;
  cin >> n;

  const ll E9 = 1000000000;

  ll ret = 0;
  rep(i, n) {
    string s;
    cin >> s;
    ll a = 0;
    int j = 0;
    int k = 9;
    for (; j < s.size(); ++j) {
      if (s[j] == '.') {
        break;
      }
      a = a * 10 + s[j] - '0';
    }
    if (j != s.size()) {
      for (++j; j < s.size(); ++j) {
        a = a * 10 + s[j] - '0';
        --k;
      }
    }
    rep(_, k) a *= 10;
    int m2 = 0;
    int m5 = 0;
    while (a % 2 == 0) {
      m2++;
      a /= 2;
    }
    while (a % 5 == 0) {
      m5++;
      a /= 5;
    }

    // printe("[%d %d] %lld\\n", m2, m5, a);

    rep(a, 20) rep(b, 20) {
      if (a + m2 < 18)
        continue;
      if (b + m5 < 18)
        continue;
      ret += cnt[a][b];
      if (cnt[a][b] > 0)
        printe("%d %d (%d)\\n", a, b, cnt[a][b]);
    }
    cnt[min(m2, 18)][min(m5, 18)]++;

    // printe("[%d,%d]\\n", m2, m5);
    // if (m2 * 2 >= 9 && m5 * 2 >= 9) ret--;
  }

  cout << ret << endl;
}