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: Accepted)

#include <iostream>
#include <string>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int n; cin >> n;
    int arr[50][50]{};
    for(int k = 0; k < n; ++k)
    {
        string s; cin >> s;
        long long y = 0;
        bool pt = false; int cnt = 9;
        for(auto c : s)
        {
            if(c == '.')
            {
                pt = true;
            }
            else
            {
                y *= 10;
                y += c - '0';
                if(pt) --cnt;
            }
        }
        while(cnt--) y *= 10;
        int i = 0; while(y % 2 == 0) y /= 2, ++i;
        int j = 0; while(y % 5 == 0) y /= 5, ++j;
        ++arr[i][j];
    }

//    for(int i = 0; i < 50; ++i)
//    {
//        for(int j = 0; j < 50; ++j)
//        {
//            for(int k = 0; k < arr[i][j]; ++k)
//                cout << i << ' ' << j << endl;
//        }
//    }

    long long ans = 0;
    for(int i = 0; i < 50; ++i)
    {
        for(int j = 0; j < 50; ++j)
        {
            int tmp = 0;
            for(int _i = max(0, 18 - i); _i < 50; ++_i)
            {
                for(int _j = max(0, 18 - j); _j < 50; ++_j)
                {
                    tmp += arr[_i][_j];
                    if(_i == i && _j == j) --tmp;
                }
            }
            ans += 1ll * tmp * arr[i][j];
        }
    }

    cout << ans / 2;
    return 0;
}