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>
using namespace std;
typedef long long ll;
typedef long double ld;
const ll MOD = 1000000007;
const ld PI = acos(-1);  
const ld EPS = 0.0000000001;
const ll LINF = 1001002003004005006ll;
const int INF = 1001001001;
#define rep(i, n) for(ll i=0; i<(ll)(n); i++)
#define repd(i, n) for(ll i=n-1; 0<=i; i--)
#define FOR(i, a, b) for(ll i=a; i<(ll)(b); i++)
#define FORD(i, a, b) for(ll i=b-1; (ll)(a)<=i; i--)
#define ALL(x) x.begin(), x.end()
#define MAX(x) *max_element(ALL(x))
#define MIN(x) *min_element(ALL(x))
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
string YES[2] = {"NO", "YES"};
string yes[2] = {"No", "Yes"};

int main(){
    ll n;   cin >> n;
    vector<ll> a(n);
    rep(i, n){
        double x;   cin >> x;
        rep(j, 10) x *= 10;
        a[i] = x/10;
        //cout << a[i] << endl;
    }
    vector<ll> c2(n, 0), c5(n, 0);
    rep(i, n){
        ll x=a[i]; 
        while(x%2==0){
            c2[i] += 1;  x /= 2;
        }
        while(x%5==0){
            c5[i] += 1;   x /= 5;
        }
    }
    vector<vector<ll>> cnt(19, vector<ll>(19, 0));
    rep(i, n) cnt[min(c2[i], 18LL)][min(c5[i], 18LL)] += 1;
    ll res=0;
    rep(a2, 19){
        rep(b2, 19){
            rep(a5, 19){
                rep(b5, 19){
                    if(a2+b2<18 || a5+b5<18) continue;
                    if(a2==b2 && a5==b5){
                        res += cnt[a2][a5]*(cnt[a2][a5]-1);
                    }else{
                        res += cnt[a2][a5]*cnt[b2][b5];
                    }
                }
            }
        }
    }
    cout << res/2 << endl;
}