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;

public class CSharp{
    public static void Main(){
        Kyopuro chokudai = new Kyopuro();
		chokudai.AtCoder(10, 10);
	}
}

public class Kyopuro{

	int n;
	int[] x2, x5;
	
    public void AtCoder(int p, int q){
		string[] input;
		input = Console.ReadLine().Split(' ');
		n = int.Parse(input[0]);
		x2 = new int[n];
		x5 = new int[n];

		long[][] y = new long[200][];
		long[][] z = new long[200][];
		for (int i=0; i<200; i++) {
			y[i] = new long[200];
			z[i] = new long[200];
		}

		for (int i = 0; i < n; i++) {
			input = Console.ReadLine().Split('.');
			int d = 0;
			long v = 0;
			long b = 1;
			if (input.Length == 2) {
				d = input[1].Length;
				b = (long)Math.Pow(10, d);
				v += long.Parse(input[1]);
			}
			v += long.Parse(input[0]) * b;
			x2[i] = 100 + d;
			x5[i] = 100 + d;
			while (v % 2 == 0) {
				x2[i]--;
				v /= 2;
			}
			while (v % 5 == 0) {
				x5[i]--;
				v /= 5;
			}
			y[x2[i]][x5[i]]++;
		}
		for (int i=0; i<199; i++){
			for (int j=0; j<199; j++) {
				z[i+1][j+1] = z[i][j+1] + z[i+1][j] - z[i][j] + y[i+1][j+1];
			}
		}
		long ans = 0;
		for (int i=0; i<n; i++){
			ans += z[200 - x2[i]][200 - x5[i]];
			if (x2[i] <= 100 && x5[i] <= 100) ans--;
		}
		
		Console.WriteLine(ans / 2);

    }
    public static void DebugWL(object x){ System.Diagnostics.Debug.WriteLine(x); }
}