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: Runtime Error)

//Code By CXY07
#include<bits/stdc++.h>
using namespace std;

//#define FILE
#define int long long
//#define LL long long
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define fst first
#define scd second
#define inv(x) ksm(x,mod - 2)
#define lowbit(x) (x & (-x))

const int MAXN = 2e5 + 10;
const int INF = 2e9;
const double PI = acos(-1);
const double mul = 1e9;
//const int mod = 1e9 + 7;
//const int mod = 998244353;
//const int G = 3;

int n,a[MAXN],ans;
int two[MAXN],five[MAXN];
int p[110][110],sum[110][110];
double tmp;

template<typename T> inline void read(T &a) {
	a = 0; char c = getchar(); int f = 1;
	while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
	while(c >= '0' && c <= '9') {a = a * 10 + (c ^ 48); c = getchar();}
	a *= f;
}

int calc(int x,int y) {
	x++,y++;
	return sum[100][100] - sum[x - 1][100] - sum[100][y - 1] + sum[x - 1][y - 1];
}

signed main () {
#ifdef FILE
	freopen(".in","r",stdin);
	freopen(".out","w",stdout);
#endif
	read(n);
	for(int i = 1;i <= n; ++i) {
		scanf("%lf",&tmp);
		a[i] = tmp * mul;
		while(a[i] % 2 == 0) two[i]++,a[i] /= 2;
		while(a[i] % 5 == 0) five[i]++,a[i] /= 5;
		p[two[i] + 1][five[i] + 1]++;
	}
	for(int i = 1;i <= 100; ++i)
		for(int j = 1;j <= 100; ++j)
			sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + p[i][j];
	for(int i = 1;i <= n; ++i) {
		ans += calc(18 - two[i],18 - five[i]);
		if(18 - two[i] <= two[i] && 18 - five[i] <= five[i]) ans--;
	}
	printf("%lld\n",ans / 2);
	return 0;
}