//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using db = double;
using ld = long double;
template<typename T> using V = vector<T>;
template<typename T> using VV = vector<vector<T>>;
#define fs first
#define sc second
#define pb push_back
#define mp make_pair
#define mt make_tuple
#define eb emplace_back
#define lb lower_bound
#define ub upper_bound
#define all(v) (v).begin(),(v).end()
#define siz(v) (ll)(v).size()
#define rep(i,a,n) for(ll i=a;i<(ll)(n);++i)
#define repr(i,a,n) for(ll i=n-1;(ll)a<=i;--i)
#define ENDL '\n'
typedef pair<int,int> Pi;
typedef pair<ll,ll> PL;
constexpr ll mod = 1000000007;
constexpr ll INF = 1000000099;
constexpr ll LINF = (ll)(1e18 +99);
const vector<ll> dx={-1,1,0,0},dy={0,0,-1,1};
template<typename T,typename U> inline bool chmin(T& t, const U& u){if(t>u){t=u;return 1;}return 0;}
template<typename T,typename U> inline bool chmax(T& t, const U& u){if(t<u){t=u;return 1;}return 0;}
template<typename T> inline T gcd(T a,T b){return b?gcd(b,a%b):a;}

template<typename T,typename Y> inline T mpow(T a, Y n) {
  T res = 1;
  for(;n;n>>=1) {
    if (n & 1) res = res * a;
    a = a * a;
  }
  return res;
}

template<typename T,typename Y>
ostream& operator<<(ostream& os,const pair<T,Y>& p){
  return os<<"{"<<p.fs<<","<<p.sc<<"}";
}
template<typename T> ostream& operator<<(ostream& os,const V<T>& v){
  os<<"{";
  for(auto e:v)os<<e<<",";
  return os<<"}";
}
template<typename ...Args>
void debug(Args&... args){
  for(auto const& x:{args...}){
    cerr<<x<<' ';
  }
  cerr<<ENDL;
}

template<typename T> 
struct presum_2D{
  int h,w;
  V<V<T>> sum;
  presum_2D(const V<V<T>>& _sum):h(_sum.size()),w(_sum[0].size()),sum(_sum){
    sum.insert(sum.begin(),V<T>(w+1,0));
    rep(i,1,h+1)sum[i].insert(sum[i].begin(),0);

    rep(i,0,h+1)rep(j,0,w)sum[i][j+1]+=sum[i][j];
    rep(j,0,w+1)rep(i,0,h)sum[i+1][j]+=sum[i][j];
  }

  inline T get_sum(int lg,int lr,int rg,int rr){
    return sum[rg+1][rr+1]+sum[lg][lr]-sum[rg+1][lr]-sum[lg][rr+1];
  }//元のindexを渡す 閉区間
};


signed main(){
  cin.tie(0);cerr.tie(0);ios::sync_with_stdio(false);
  cout<<fixed<<setprecision(20);
  ll n;cin>>n;

  VV<ll> tmp(501,V<ll>(501,0));
  V<ll> t(n),f(n);

  rep(i,0,n){
    string s;cin>>s;
    ll x=0,y=1;
    bool flag=false;

    rep(j,0,siz(s)){
      if(s[j]=='.'){
        flag=true;
        continue;
      }
      x*=10;
      x+=s[j]-'0';

      if(flag)y*=10;
    }
    ll g=gcd(x,y);
    x/=g;
    y/=g;

    ll a=0,b=0;

    while(x && x%2==0){
      a++;
      x/=2;
    }
    while(x && x%5==0){
      b++;
      x/=5;
    }
    while(y && y%2==0){
      a--;
      y/=2;
    }
    while(y && y%5==0){
      b--;
      y/=5;
    }

    a+=100;
    b+=100;
    tmp[a][b]++;
    t[i]=a-100;
    f[i]=b-100;
    
    //debug(a,b);
  }

  presum_2D<ll> sum(tmp);
  ll ans=0;

  rep(i,0,n){
    ans+=sum.get_sum(100-t[i],100-f[i],497,497);
    if(t[i]>=0 && f[i]>=0)ans--;
  }
  ans/=2;
  cout<<ans<<ENDL;
}
//! ( . _ . ) ! 
//CHECK overflow,vector_size,what to output?

Measured memory_bytes: 12436