#include<bits/stdc++.h>
using namespace std;
#define ALL(x) x.begin(),x.end()
#define rep(i,n) for(int i=0;i<(n);i++)
#define debug(v) cout<<#v<<":";for(auto x:v){cout<<x<<' ';}cout<<endl;
#define mod 1000000007
using ll=long long;
const int INF=1000000000;
const ll LINF=1001002003004005006ll;
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
// ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
template<class T>bool chmax(T &a,const T &b){if(a<b){a=b;return true;}return false;}
template<class T>bool chmin(T &a,const T &b){if(b<a){a=b;return true;}return false;}
 
struct IOSetup{
    IOSetup(){
        cin.tie(0);
        ios::sync_with_stdio(0);
        cout<<fixed<<setprecision(12);
    }
} iosetup;
 
template<typename T1,typename T2>
ostream &operator<<(ostream &os,const pair<T1,T2>&p){
    os<<p.first<<" "<<p.second;
    return os;
}
 
template<typename T>
ostream &operator<<(ostream &os,const vector<T>&v){
    for(int i=0;i<(int)v.size();i++) os<<v[i]<<(i+1==(int)v.size()?"":" ");
    return os;
}

template<typename T1,typename T2>
istream &operator>>(istream &is,pair<T1,T2>&p){
    is>>p.first>>p.second;
    return is;
}

template<typename T>
istream &operator>>(istream &is,vector<T>&v){
    for(T &x:v)is>>x;
    return is;
}

// 2^127 = 170141183460469231731687303715884105728 ~ 10^38
using int128=__int128;
 
ostream &operator<<(ostream &os,const __int128 n){
    if(n==0){
        os<<0;
        return os;
    }
    __int128 num=n;
    bool neg=false;
    if(num<0)neg=true,num=-num;
    string res="";
    while(num>0){
        res.push_back('0'+num%10);
        num/=10;
    }
    if(neg) res.push_back('-');
    reverse(begin(res),end(res));
    os<<res;
    return os;
}
 
istream &operator>>(istream &is,__int128 &n){
    string s;
    is>>s;
    int idx=0;
    bool neg=false;
    if(s[0]=='-')neg=true,idx++;
    n=0;
    for(;idx<(int)s.size();idx++){
        n=10*n+s[idx]-'0';
    }
    if(neg) n=-n;
    return is;
}
 
__int128 abs(__int128 x){
    return x<0?-x:x;
}
 
__int128 gcd(__int128 a,__int128 b){
    if(a==0) return b;
    if(b==0) return a;
    return b>0?gcd(b,a%b):a;
}
 
// res * 10^(-b)
pair<int128,int> freader(){
    string s;cin>>s;
    int i=0;bool neg=false;
    if(s[0]=='-')i++,neg=true;
    int128 res=0;int b=0;bool t=false;
    for(;i<(int)s.size();i++){
        if(s[i]=='.'){
            t=true;
            continue;
        }
        res=10*res+(s[i]-'0');
        if(t)b++;
    }
    if(neg)res=-res;
    return make_pair(res,b);
}

struct RangeTree{
    // xの各値がyのソート済み配列を持つ
    vector<vector<ll>>seg;
    vector<ll>x;
    int sz;
    RangeTree(vector<pair<ll,ll>> a){
        sz=1;
        while((int)a.size()>sz)sz<<=1;
        sort(begin(a),end(a));
        if(a.size())x.push_back(a[0].first);
        for(auto &p:a)if(x.back()!=p.first)x.push_back(p.first);
        while((int)x.size()<sz)x.push_back(LINF);
        seg.resize(2*sz);
        int pos=0;
        for(auto &p:a){
            if(x[pos]!=p.first)pos++;
            seg[pos+sz].push_back(p.second);
        }
        for(int i=sz-1;i>0;i--){
            seg[i].resize(seg[2*i].size()+seg[2*i+1].size());
            merge(begin(seg[2*i]),end(seg[2*i]),begin(seg[2*i+1]),end(seg[2*i+1]),begin(seg[i]));
        }
    }
    // [x1,x2),[y1,y2)
    int count(ll x1,ll y1,ll x2,ll y2){
        int l=lower_bound(begin(x),end(x),x1)-begin(x),r=lower_bound(begin(x),end(x),x2)-begin(x);
        l+=sz,r+=sz;
        int ret=0;
        for(;l<r;l>>=1,r>>=1){
            if(l&1){
                ret+=lower_bound(begin(seg[l]),end(seg[l]),y2)-lower_bound(begin(seg[l]),end(seg[l]),y1);
                l++;
            }
            if(r&1){
                r--;
                ret+=lower_bound(begin(seg[r]),end(seg[r]),y2)-lower_bound(begin(seg[r]),end(seg[r]),y1);
            }
        }
        return ret;
    }
};


signed main(){
    int n;cin>>n;
    vector<int128> v;
    rep(i,n){
        auto [p,b]=freader();
        while(b<9){
            b++;p*=10;
        }
        v.push_back(p);
    }
    vector<pair<ll,ll>> w;
    rep(i,n){
        int a=0,b=0;
        while(v[i]%2==0)a++,v[i]/=2;
        while(v[i]%5==0)b++,v[i]/=5;
        w.push_back(make_pair(a,b));
    }

    ll res=0;
    RangeTree seg(w);

    rep(i,n){
        ll x=18-w[i].first,y=18-w[i].second;
        res+=seg.count(x,y,INF,INF);
        if(2*w[i].first>=18 and 2*w[i].second>=18)res--;
    }
    res/=2;
    cout<<res<<endl;
    return 0;
}


Measured memory_bytes: 57472