Problem:
Score : 300 points

Problem Statement

You are given N real values A_1, A_2, \ldots, A_N.
Compute the number of pairs of indices (i, j)
such that i < j and the product A_i \cdot A_j is integer.

Constraints

2 \leq N \leq 200\,000

0 < A_i < 10^4

A_i is given with at most 9 digits after the decimal.

Input

Input is given from Standard Input in the following format.

N
A_1
A_2
\vdots
A_N

Output

Print the number of pairs with integer product A_i \cdot A_j (and i < j).

Sample Input 1

5
7.5
2.4
17.000000001
17
16.000000000

Sample Output 1

3

There are 3 pairs with integer product:

7.5 \cdot 2.4 = 18

7.5 \cdot 16 = 120

17 \cdot 16 = 272

Sample Input 2

11
0.9
1
1
1.25
2.30000
5
70
0.000000001
9999.999999999
0.999999999
1.000000001

Sample Output 2

8

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)


#include <bits/stdc++.h>

#define rep(i,n)  for(int i = 0; i < (int)(n); i++)
#define sz(x)     ((int)(x).size())
#define all(x)    (x).begin(),(x).end()

using ll = long long;

ll gcd ( ll a, ll b ) { if ( b == 0 ) return a; else return gcd ( b, a%b ); }
ll lcm ( ll a, ll b ) { return a * b / gcd(a, b); }

class CumulativeSum {
  private:
    int H_, W_;
    std::vector<std::vector<long long>> s;

  public:
    explicit CumulativeSum (int H, int W) : H_(H), W_(W) {
      s.resize(H+1); for(int i=0; i<=H; i++) s[i].resize(W+1);
      s[0][0] = 0;
      for(int i=0; i<=H_; i++) s[i][0] = 0;
      for(int i=0; i<=W_; i++) s[0][i] = 0;
    }

    void set(int i, int j, long long a) {
      s[i+1][j+1] = a;
      return;
    }

    void add(int i, int j, long long a) {
      s[i+1][j+1] += a;
      return;
    }

    void build() {
      for(int i=0; i<=H_; i++) for(int j=1; j<=W_; j++) s[i][j] += s[i][j-1];
      for(int i=1; i<=H_; i++) for(int j=0; j<=W_; j++) s[i][j] += s[i-1][j];
    }

    void build ( const std::vector<std::vector<long long>> &a ) {
      for(int i=1; i<=H_; i++) for(int j=1; j<=W_; j++) s[i][j] = a[i-1][j-1];
      for(int i=0; i<=H_; i++) for(int j=1; j<=W_; j++) s[i][j] += s[i][j-1];
      for(int i=1; i<=H_; i++) for(int j=0; j<=W_; j++) s[i][j] += s[i-1][j];
    }

    // h : [i,j],  w : [k,m]
    long long Get(int i, int j, int k, int m) {
      return s[j+1][m+1] - s[i][m+1] + s[i][k] - s[j+1][k];
    }
};



int main (void) {
  std::cin.tie(0);  std::ios::sync_with_stdio(false);
  ll N; std::cin >> N;
  std::vector<ll> A(N);
  rep(i,N) {
    double a; std::cin >> a;
    A[i] = a * 1e10;
  }

  std::vector<ll> two(N), five(N);
  rep(i,N) {
    ll cnt = 0;
    auto tmp = A[i];
    while( tmp % 2 == 0 ) {
      tmp /= 2;
      cnt++;
    }
    two[i] = cnt;

    cnt = 0;
    tmp = A[i];
    while( tmp % 5 == 0 ) {
      tmp /= 5;
      cnt++;
    }
    five[i] = cnt;
  }

  CumulativeSum S(62,62);
  rep(i,N) S.add(two[i], five[i], 1);
  S.build();

  ll ans = 0;
  rep(i,N) {
    ll t = two[i];
    ll f = five[i];
    ans += S.Get( std::max<int>(0,20-t), 61, std::max<int>(0,20-f), 61 );
  }
  rep(i,N) if ( two[i] >= 10 && five[i] >= 10 ) ans--;
  ans /= 2;
  std::cout << ans << std::endl;
  return 0;
}