/*
TASK: abc
LANG: C
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define maxN (1<<10)

typedef struct niz {
        char s[24];
        char in;
        char len;
        } niz;

int pp[24],n,a=0,b=1;
niz list[maxN];

int cmp(const void *a, const void *b)
{return (*(niz *)a).len - (*(niz *)b).len;}

int gcd(int x, int y)
{
    int t;
    while (y > 0) {
          x = x%y;
          if (y > x) {
             t = x;
             x = y;
             y = t;
             }
          }
    return x;
}

void init()
{
     int i,m=-1;
     scanf("%d",&n);
     for (i=0;i<n;++i){
         scanf("%s",list[i].s);
         list[i].len = strlen(list[i].s);
         if (list[i].len > m) m = list[i].len;
         list[i].in = 1;
         }
     pp[0] = 1;
     for (i=1;i<=n;++i) pp[i] = pp[i-1]*4;
     qsort(list,n,sizeof(list[0]),cmp);
}

void solve()
{
     int i,j,k,fl;
     for (i=0;i<n;++i){
         for (j=i+1;j<n;++j) if (list[j].len > list[i].len){
             fl = 1;
             for (k=0;k<list[i].len;++k) if (list[i].s[k] != list[j].s[k]) {fl=0;break;}
             if (fl) {list[j].in = 0;break;}
             }
         }
     for (i=0;i<n;++i) if (list[i].in) {
         a = a*pp[list[i].len] + b;
         b = b*pp[list[i].len];
         }
     fl = gcd(a,b);
     a /= fl; b /= fl;
     printf("%d %d\n",a,b);
}

int main()
{
    init();
    solve();
    /*system("pause");*/
    return 0;
}
