#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vii;
typedef vector<vi> vvi;
typedef vector<pll> vll;
typedef vector<vl> vvl;

#define fori(i, n) for (int i = 0; i < n; i++)
#define ford(i, n) for (int i = n - 1; i >= 0; i--)
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define repd(i, a, b) for (int i = a; i >= b; i--)
#define trav(x, a) for (auto &x : a)
#define all(x) (x).begin(), (x).end()
#define pb push_back
#define eb emplace_back
#define endl '\n'
#define sz(a) (int)(a).size()
#define fi first
#define se second

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
typedef tree<pii, null_type, less<pii>, rb_tree_tag, tree_order_statistics_node_update> oset;

clock_t time_p = clock();
void time_taken()
{
    time_p = clock() - time_p;
    cerr << "Time Taken : " << (float)(time_p) / CLOCKS_PER_SEC << "\n";
}

const ll mod = 1e9 + 7;
const ll INF = 1e18;

#define TRACE
#ifdef TRACE
#define trace(...) { cerr<<"[ "; __trace__(#__VA_ARGS__, __VA_ARGS__);}
#undef endl
template <typename Arg1,typename Arg2>
ostream& operator << (ostream& out, const pair<Arg1,Arg2> &x) {
    return out<<"("<<x.first<<","<<x.second<<")";
}
 
template <typename Arg1>
ostream& operator << (ostream& out, const vector<Arg1> &a) {
    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
}
 
template <typename Arg1>
ostream& operator << (ostream& out, const set<Arg1> &a) {
    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
}
 
template <typename Arg1,typename Arg2>
ostream& operator << (ostream& out, const map<Arg1,Arg2> &a) {
    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
}
 
template <typename Arg1>
void __trace__(const string name, Arg1&& arg1){
    cerr << name << " : " << arg1 << " ] " << endl;
}
 
template <typename Arg1, typename... Args>
void __trace__(const string names, Arg1&& arg1, Args&&... args){
    const string name = names.substr(0,names.find(','));
    cerr<<name<<" : "<<arg1<<" | ";
    __trace__(names.substr(1+(int)name.size()), args...);
}
#else
    #define trace(args...)
#endif
 

int main()
{
    ios_base::sync_with_stdio(false), cin.tie(nullptr);

    int n;
    cin >> n;
    vector<ll> a(n);
    fori(i, n) {
        string s;
        cin >> s;
        string s1 = "",s2 = "";
        bool fl = 0;
        fori(i, sz(s))
        {
            if(s[i]=='.'){
                fl = 1;
                s2 = s.substr(i+1, sz(s) - (i + 1));
                break;
            }
            s1 += s[i];
        }
        while(sz(s2)<9){
            s2 += '0';
        }
        string S = s1+s2;
        int j = 0;
        while (j < sz(S) and s[j] == '0')
            j++;
        if(j==sz(S)){
            a[i] = 0;
        }
        else{
            a[i] = stoll(S.substr(j));
        }
    }
    vii b(n);
    fori(i, n)
    {
        ll num = a[i];
        ll den = 1e9;
        ll g = __gcd(num, den);
        num /= g;
        den /= g;
        while(num%2==0){
            num >>= 1;
            b[i].fi++;
        }
        while(den%2==0){
            den >>= 1;
            b[i].fi--;
        }
        while(num%5==0){
            num /= 5;
            b[i].se++;
        }
        while(den%5==0){
            den /= 5;
            b[i].se--;
        }
    }
    sort(all(b));
    ll res = 0;
    int j = n-1;
    oset os;
    fori(i, n)
    {
        while(j>=0 and b[j].fi >= -b[i].fi){
            os.insert({b[j].se, j});
            j--;
        }
        int cnt = sz(os) - os.order_of_key({-b[i].se, -1});
        if(b[i].fi >= -b[i].fi and b[i].se >= -b[i].se)
            cnt--;
        res += cnt;
    }

    cout << res/2 << endl;

    time_taken();
    return 0;
}

Measured memory_bytes: 18836