/**
 * code generated by JHelper
 * More info: https://github.com/AlexeyDmitriev/JHelper
 * @author
 */

#include <iostream>
#include <fstream>

#ifndef  _TB
#define _TB

#include <bits/stdc++.h>

using namespace std;

#define FOR(i, a, b) for(int i = (a); i < (b); ++i)
#define RFOR(i, b, a) for(int i = (b) - 1; i >= (a); --i)
#define REP(i, N) FOR(i, 0, N)
#define RREP(i, N) RFOR(i, N, 0)

#define MIN(A, B) ((A) < (B) ? (A) : (B))
#define MAX(A, B) ((A) > (B) ? (A) : (B))
#define ABS(A) ((A) < 0 ? (-(A)) : (A))
#define ALL(V) V.begin(), V.end()
#define SIZE(V) (int)V.size()
#define pb push_back
#define mp make_pair
#define EPS 1e-7
#define Pi 3.14159265358979
#define FILL(a,v) memset(a,v,sizeof(a))

using namespace std;

typedef long long Long;
typedef unsigned long long ULong;
typedef unsigned int Uint;
typedef unsigned char Uchar;
typedef vector <int> VI;
typedef pair <int, int> PII;

#define X first
#define Y second

typedef std::pair<int,int> pii; typedef long long ll; typedef unsigned long long ull; typedef unsigned int ui; typedef pair<ui,ui> puu;

template <typename T, typename U> std::istream&operator>>(std::istream&i, pair<T,U>&p) {i >> p.X >> p.Y; return i;}
template<typename T>std::istream&operator>>(std::istream&i,vector<T>&t) {for(auto&v:t){i>>v;}return i;}
template <typename T, typename U> std::ostream&operator<<(std::ostream&o, const pair<T,U>&p) {o << p.X << ' ' << p.Y; return o;}
template<typename T>std::ostream&operator<<(std::ostream&o,const vector<T>&t) {if(t.empty())o<<'\n';for(size_t i=0;i<t.size();++i){o<<t[i]<<" \n"[i == t.size()-1];}return o;}
template<typename T> using minheap = priority_queue<T, vector<T>, greater<T>>;
template<typename T> using maxheap = priority_queue<T, vector<T>, less<T>>;
template <typename T> bool in(T a, T b, T c) { return a <= b && b < c; }
ui logceil(int x) { return (ui)(8*sizeof(int)-__builtin_clz(x)); }

namespace std { template<typename T,typename U>struct hash<pair<T,U>>{hash<T>t;hash<U>u;size_t operator()(const pair<T,U>&p)const{return t(p.x)^(u(p.y)<<7);}}; }
template<typename T> T gcd(T a,T b) { if (a<b) swap(a,b); return b?gcd(b,a%b):a; }

template<typename T>class vector2:public vector<vector<T>>{public:vector2(){} vector2(size_t a,size_t b,T t=T()):vector<vector<T>>(a,vector<T>(b,t)){}};
template<typename T>class vector3:public vector<vector2<T>>{public:vector3(){} vector3(size_t a,size_t b,size_t c,T t=T()):vector<vector2<T>>(a,vector2<T>(b,c,t)){}};
template<typename T>class vector4:public vector<vector3<T>>{public:vector4(){} vector4(size_t a,size_t b,size_t c,size_t d,T t=T()):vector<vector3<T>>(a,vector3<T>(b,c,d,t)){}};
template<typename T>class vector5:public vector<vector4<T>>{public:vector5(){} vector5(size_t a,size_t b,size_t c,size_t d,size_t e,T t=T()):vector<vector4<T>>(a,vector4<T>(b,c,d,e,t)){}};

void fastIO(){ios::sync_with_stdio(false); }

#endif


class Fraction {
    friend ostream& operator<<(ostream& os, const Fraction& f);
public:
    Fraction(ll u = 0, ll v = 1) : u(u), v(v) { norm(); }
    bool operator==(const Fraction & o) const { return u == o.u && v == o.v; }
    bool operator!=(const Fraction & o) const { return u != o.u || v != o.v; }
    bool operator<(const Fraction &o) const { return u*o.v < o.u*v; }
    bool operator<=(const Fraction &o) const { return u*o.v <= o.u*v; }
    bool operator>(const Fraction &o) const { return u*o.v > o.u*v; }
    bool operator>=(const Fraction &o) const { return u*o.v >= o.u*v; }
    Fraction operator-() { return Fraction(-u, v); }

    Fraction& operator+=(const Fraction& o) { u = u * o.v + v * o.u; v *= o.v; return norm(); }
    Fraction& operator-=(const Fraction& o) { u = u * o.v - v * o.u; v *= o.v; return norm(); }
    Fraction& operator/=(const Fraction& o) { u = u * o.v; v = o.u * v; return norm(); }
    Fraction& operator*=(const Fraction& o) { u *= o.u; v *= o.v; return norm(); }
    Fraction operator+(const Fraction& o) const { Fraction f(*this); return f += o; }
    Fraction operator-(const Fraction& o) const { Fraction f(*this); return f -= o; }
    Fraction operator*(const Fraction& o) const { Fraction f(*this); return f *= o; }
    Fraction operator/(const Fraction& o) const { Fraction f(*this); return f /= o; }


    ll u,v;

private:
    Fraction& norm() {
        ll g = gcd(abs(u),abs(v));
        u /= g;
        v /= g;
        if (v < 0) {
            u = -u;
            v = -v;
        }
        return *this;
    }
};


ostream& operator<<(ostream& os, const Fraction& f) {
    os << f.u << '/' << f.v;
    return os;
}


const int base = 1'000'000'000;



class AIntegerProduct {
public:
    void solve(std::istream& in, std::ostream& out) {
        int n;
        in >> n;
        string s;

        VI inter;
        for(int i = 1; i*i <= base; ++i) {
            if (base%i == 0) {
                inter.push_back(i);
                inter.push_back(base/i);
            }
        }

//        out << inter.size() << endl;

        map<Fraction, Long> ready;


        REP(i, n) {
            in >> s;
            Fraction cur = 0;
            if (s.find('.') == string::npos) {
                cur = atoi(s.c_str());
            } else {
                auto pos = s.find('.');
                auto ls = s.substr(0, pos);
                auto rs = s.substr(pos+1);

                while (rs.length() != 9)
                    rs += '0';

                auto lf = Fraction(atoi(ls.c_str()));
                auto rf = Fraction(atoi(rs.c_str()), base);

                cur = lf+rf;
            }

            auto u = cur.u;
            auto v = cur.v;

            Long nu = gcd(u, base);
            ready[Fraction(nu,v)]++;
        }

        Long ans = 0;


        for(auto u1: inter)
            for(auto v1: inter) {
                if (gcd(u1, v1) != 1)
                    continue;
                for(auto u2: inter)
                    for(auto v2: inter) {
                        if (gcd(u2, v2) != 1)
                            continue;

                        auto f1 = Fraction(u1, v1);
                        auto f2 = Fraction(u2, v2);

                        auto f = f1*f2;
                        if (f.v != 1)
                            continue;

                        if (f1 > f2)
                            continue;

                        if (f1 == f2) {
                            ans += 1LL*ready[f1]*(ready[f1]-1)/2;
                        } else {
                            ans += 1LL*ready[f1]*ready[f2];
                        }
                    }
            }

        out << ans << endl;
    }
};


int main() {
	AIntegerProduct solver;
	std::istream& in(std::cin);
	std::ostream& out(std::cout);
	solver.solve(in, out);
	cerr << 1.0 * clock() / CLOCKS_PER_SEC << endl;
	return 0;
}


Measured memory_bytes: 3852