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<iostream>
#include<vector>
#include<algorithm>
#include<cmath>

int main (){
    std::cin.tie(0); 
	std::ios::sync_with_stdio(false);
    int N;std::cin >> N;

    //std::vector<long double> A2(N,0); // 小数用
    std::vector<long double> A1(N,0); // 整数用
    std::vector<long double> A(1000,0); // 添え字＝小数点以下

    int A1Length=0;
    long double a;
    long long ans=0;
    for (int i=0;i<N;++i){
        std::cin >> a;
        // An < 10^4 なので、小数第４位以降に数値入っている値は整数にならないはず
        //if (std::floor(1000 * a) != 1000 * a ) {
        //    continue;
        //}

        int index = (a - std::floor(a)) * 1000;
        A[index]++;
        if (index==0) { //整数は別管理にしておく
            A1[A1Length]=a;
            ++A1Length;
        }
    }

    for (int i=1;i<1000;++i) {
        for (int j=0;j<A1Length;++j) {
            long long d = A1[j] * i;
            if ( d % 1000 == 0) {
                //std::cout << A1[j] << " * " << i << std::endl;
                ans += A[i];
            }
        }
        for (int j=1;j<i;++j){
            if (i*j % 1000 == 0) {
                //std::cout << i << " * " << j << std::endl;
                ans += A[i] * A[j];
            }
        }
    }
    ans += A1Length * (A1Length-1) / 2;
    std::cout << ans;
    return 0 ;
}