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# (.NET Core 3.1.201) (judge verdict: Accepted)

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        double[] D = new double[n];
        for(int i = 0; i < n; i++)
        {
            D[i] = (long)(double.Parse(Console.ReadLine()) * 1000000000 + 0.5);
        }
        int[,] hist = new int[64, 64];
        foreach(var x in D)
        {
            var n2 = 0;
            var n5 = 0;
            var current = x;
            while (current % 2 == 0)
            {
                n2++;
                current /= 2;
            }
            while (current % 5 == 0)
            {
                n5++;
                current /= 5;
            }
            hist[n2, n5]++;
        }
        long ans = 0;
        //左の数のi=(２で割れる回数),j=(5で割れる回数)
        for(int i = 0; i < 64; i++)
        {
            for(int j = 0; j < 64; j++)
            {
                //右の数のp=(２で割れる回数),q=(5で割れる回数)
                for (int p = 0; p < 64; p++)
                {
                    for(int q = 0; q < 64; q++)
                    {
                        //最初に10^9で掛けているので、i+p>=18超えないと正の整数にならない
                        if(i+p>=18 && j + q >= 18)
                        {
                            if (i == p && j == q) ans += (1L * hist[i, j] * (hist[i, j] - 1));
                            else ans += 1L * hist[i, j] * hist[p, q];
                        }
                    }
                }
            }
        }
        Console.WriteLine(ans / 2);
    }
}

//namespace A
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            int n = int.Parse(Console.ReadLine());
//            var A = new List<decimal>();//整数
//            var B = new List<decimal>();//小数
//            for (int i = 0; i < n; i++)
//            {
//                decimal t = decimal.Parse(Console.ReadLine());
//                if (t % 1 == 0) A.Add(t);
//                else B.Add(t);
//            }
//            int a = A.Count;
//            int b = B.Count;
//            int cnt = a * (a-1)/2;
//            for (int i = 0; i < b-1; i++)
//            {
//                for (int j = i + 1; j < b; j++)
//                {
//                    decimal t = B[i] * B[j];
//                    if (t % 1 == 0)
//                    {
//                        //Console.WriteLine($"{B[i]}*{B[j]}={t}");
//                        cnt++;
//                    }
//                }
//            }
//            for(int i = 0; i < b; i++)
//            {
//                for(int j = 0; j < a; j++)
//                {
//                    decimal t = B[i] * A[j];
//                    if (t % 1 == 0)
//                    {
//                        //Console.WriteLine($"{B[i]}*{A[j]}={t}");
//                        cnt++;
//                    }
//                }
//            }
//            Console.WriteLine(cnt);
//        }
//    }
//}
//namespace A
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            int n = int.Parse(Console.ReadLine());
//            var L = new List<double>();
//            for (int i = 0; i < n; i++)
//            {
//                double t = double.Parse(Console.ReadLine());
//                var s = t * 1000000;
//                if (s % 1 == 0) L.Add(t);
//            }
//            int cnt = 0;
//            int m = L.Count;
//            for (int i = 0; i < m - 1; i++)
//            {
//                for (int j = i + 1; j < m; j++)
//                {
//                    double t = L[i] * L[j];
//                    if (t % 1 == 0)
//                    {
//                        cnt++;
//                    }
//                }
//            }
//            Console.WriteLine(cnt);
//        }
//    }
//}

//TLE
//namespace A
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            int n = int.Parse(Console.ReadLine());
//            decimal[] A = new decimal[n];
//            for(int i=0; i < n; i++)
//            {
//                A[i] = decimal.Parse(Console.ReadLine());
//            }
//            int cnt = 0;
//            for(int i = 0; i < n - 1; i++)
//            {
//                for(int j = i+1; j < n; j++)
//                {
//                    decimal t = A[i] * A[j];
//                    if (t % 1 == 0)
//                    {
//                        cnt++;
//                    }
//                }
//            }
//            Console.WriteLine(cnt);
//        }
//    }
//}