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 Java (OpenJDK 11.0.6) (judge verdict: Accepted)

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        long[] a = new long[n];
        int[][] data = new int[n][2];
        for (int i=0;i<n;i++){
            String s = sc.next();
            int count = 0;
            boolean b = true;
            for (int j=0;j<s.length();j++){
                if (!b)count++;
                if (s.charAt(j)!='.'){
                    a[i]=a[i]*10+s.charAt(j)-'0';
                }else {
                    b=false;
                }
            }
            while (count<9){
                a[i]*=10;
                count++;
            }
            long ins = a[i];
            while (ins%2==0){
                ins/=2;
                data[i][0]++;
            }
            ins = a[i];
            while (ins%5==0){
                ins/=5;
                data[i][1]++;
            }
        }
        int[][] table = new int[19][19];
        int baseAll = 0;
        int[] base2 = new int[19];
        int[] base5 = new int[19];
        for (int i=0;i<n;i++){
            if (data[i][0]>=18&&data[i][1]>=18)baseAll++;
            else if (data[i][0]>=18){
                for (int j=18-data[i][1];j<19;j++)base2[j]++;
            }
            else if (data[i][1]>=18){
                for (int j=18-data[i][0];j<19;j++)base5[j]++;
            }
            else {
                for (int j=18-data[i][0];j<19;j++){
                    for (int k=18-data[i][1];k<19;k++){
                        table[j][k]++;
                    }
                }
            }
        }
        long ans = 0;
        for (int i=0;i<n;i++){
            int pos2 = Math.min(data[i][0],18);
            int pos5 = Math.min(data[i][1],18);
            int def = baseAll+base2[pos5]+base5[pos2]+table[pos2][pos5];
            if (pos2>=9&&pos5>=9)def--;
            ans+=def;
        }
        System.out.println(ans/2);
    }
}