/*
TASK:abc
LANG:C++
*/
# include <stdio.h>
# include <string.h>
# define MAXN (1<<10)
# define MAXT (1<<5)
# define min(a,b) (((a) < (b)) ? (a) : (b))

int n,cnt[MAXT];
unsigned long long ansup,ansd;
struct tr {
    int ok;
    char s[MAXT];   
} data[MAXN];

void read() {
    scanf("%d",&n);
    for(int i = 0; i < n; i++) {
        scanf("%s",data[i].s);         
    }
}

void del() {
    for(int i = 0; i < n-1; i++) {
         for(int j = i+1; j < n; j++) {
               
              if(strncmp(data[i].s,data[j].s,min(strlen(data[i].s),strlen(data[j].s))) == 0) {
                    if(min(strlen(data[i].s),strlen(data[j].s)) == strlen(data[j].s)) {
                          data[i].ok = -1;
                          break;       
                    }
                    else data[j].ok = -1;
              }
         }
    }
    //for(int i = 0; i < n; i++) printf("ok = %d\n", data[i].ok);
}

unsigned long long calc(int a) {
    unsigned long long p = 1;
    for(int i = 1; i <= a; i++) p *= (unsigned long long)4;
    return p;    
}

void work() {
    int max = -1;
    for(int i = 0; i < n; i++) {
        if(data[i].ok != -1) {
             int p = strlen(data[i].s);
             if(max < p) max = p;
             cnt[p]++;              
        }        
    }
    //for(int i = 1; i < 10; i++) printf("%d ", cnt[i]);
    //printf("\n");
    ansd = calc(max);
    
    ansup = cnt[max];     
    for(int j = max-1; j > 0; j--) {
            ansup += cnt[j]*calc(max-j);     
    }
    //printf("%llu %llu\n", ansup,ansd);
    while(ansup%2 == 0 && ansd > 1) {
         ansup /= 2;
         ansd /=2;              
    }
    
    printf("%llu %llu\n", ansup,ansd);
    
    
}

int main() {
    read();   
    del();
    work();
    return 0;
}
