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: Accepted)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define ll long long
#define rep(i,l,r)for(ll i=(l);i<(r);i++)
#define repp(i,l,r,k)for(ll i=(l);i<(r);i+=(k))
#define INF ((1LL<<62)-(1LL<<31))
#define max(p,q)((p)>(q)?(p):(q))
#define min(p,q)((p)<(q)?(p):(q))
#define bit(n,m)(((n)>>(m))&1)
int upll(const void*a, const void*b){return*(ll*)a<*(ll*)b?-1:*(ll*)a>*(ll*)b?1:0;}
int downll(const void*a, const void*b){return*(ll*)a<*(ll*)b?1:*(ll*)a>*(ll*)b?-1:0;}
void sortup(ll*a,int n){qsort(a,n,sizeof(ll),upll);}
void sortdown(ll*a,int n){qsort(a,n,sizeof(ll),downll);}
ll pom(ll a,ll n,int m){ll x=1;for(a%=m;n;n/=2)n&1?x=x*a%m:0,a=a*a%m;return x;}
//#define MOD 998244353
#define MOD 1000000007
#define invp(a,p)pom(a,p-2,p)

ll a[100][100];

int main(){
	int n;
	scanf("%d",&n);
	rep(_,0,n){
		char s[20]={};
		scanf("%s",s);
		int p=-1;
		for(int i=0;i<20;i++)if(s[i]=='.')p=i;
		ll x;
		sscanf(s,"%lld",&x);
		rep(i,0,9)x*=10;
		if(p==-1){
		}else{
			ll d;
			sscanf(s+p+1,"%lld",&d);
			int z=9-strlen(s+p+1);
			rep(i,0,z)d*=10;
			x+=d;
		}
		//printf("%lld\n",x);
		int p2=0,p5=0;
		while(x%2==0)x/=2,p2++;
		while(x%5==0)x/=5,p5++;
		a[p2][p5]++;
		//printf("%lld %lld\n",p2,p5);
	}
	
	ll ans=0;
	rep(i,0,50)rep(j,0,50)rep(ii,0,50)rep(jj,0,50){
		if(i+ii>=18&&j+jj>=18){
			ans+=a[i][j]*a[ii][jj];
			if(i==ii&&j==jj)ans-=a[i][j];
		}
	}
	printf("%lld\n",ans/2);
	
}