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)

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<sstream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<cmath>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<numeric>
#include<functional>
#include<algorithm>
#include<bitset>
#include<tuple>
#include<unordered_set>
#include<unordered_map>
#include<random>
#include<array>
#include<cassert>
using namespace std;
#define INF ((1<<30)-1)
#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define all(v) v.begin(),v.end()


int gcd(int a, int b) {
	if (b == 0)return a;
	return gcd(b, a % b);
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int n;
	cin >> n;
	vector<int> v;
	vector<int> div;


	rep(i, n) {
		string s;
		cin >> s;

		int a = 0, b = 0;

		auto p = s.find('.');
		if (p==string::npos) {
			a = atoi(s.c_str());
			b = 0;
		}
		else {
			s[p] = '\0';
			a = atoi(s.c_str());

			bool ok = true;
			for (int i = 4;; i++) {
				if (p + 1 + i >= s.size())break;
				if (s[p + 1 + i] != '0') {
					ok = false;
					break;
				}
			}
			if (!ok)continue;
			b = 0;
			if (p + 1 < s.size()) b += (s[p + 1] - '0') * 1000;
			if (p + 2 < s.size()) b += (s[p + 2] - '0') * 100;
			if (p + 3 < s.size()) b += (s[p + 3] - '0') * 10;
			if (p + 4 < s.size()) b += (s[p + 4] - '0') * 1;
		}
		
		int c = a * 10000 + b;
		for (int i = 1; i * i <= c; i++) {
			if (c % i == 0) {
				div.emplace_back(i);
				if (i * i != c)div.emplace_back(c / i);
			}
		}
		v.push_back(c);
	}
	sort(all(div));
	long long ans = 0;

	for (int b: v) {
		int x = 100000000 / gcd(100000000, b);
		ans += upper_bound(all(div), x) - lower_bound(all(div), x);

		if ((long long)b * b % 100000000 == 0)ans--;
	}

	cout << ans / 2 << endl;


	return 0;
}