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<string.h>

long long llgcd(long long a,long long b){long long c;while(b!=0){c=a%b;a=b;b=c;}return a;}
long long llmin(long long a,long long b){if(a<b){return a;}return b;}

int main(void){
  long long i,j,n,m,k,a,b,c,h,w,r=0,l,t,g;
  long long mem[64][64]={0};
  char s[64];
  scanf("%lld",&n);
  for(i=0;i<n;i++){
    scanf("%s",s);
    l=strlen(s);
    t=0;w=0;a=0;
    for(j=0;j<l;j++){
      if(s[j]=='.'){t=1;continue;}
      a*=10;
      a+=(s[j]-'0');
      if(t){w++;}
    }
    for(j=w+1;j<=9;j++){a*=10;}
    g=a;
    h=0;w=0;
    while(g%2==0){g/=2;h++;}
    while(g%5==0){g/=5;w++;}
    //printf("%lld %lld\n",h,w);
    mem[h][w]++;
  }
  for(i=0;i<64;i++){
    for(j=0;j<64;j++){
      for(k=0;k<64;k++){
        for(l=0;l<64;l++){
          if((i+k)<18 || (j+l)<18){continue;}
          if(i==k&&j==l){
            if(mem[i][j]>=2){
              r+=(mem[i][j]*(mem[i][j]-1));
            }
          }
          else{
            r+=(mem[i][j]*mem[k][l]);
          }
        }
      }
    }
  }
  printf("%lld\n",r/2);
  return 0;
}