/*
TASK:abc
LANG:C
*/
#include <stdio.h>
#include <string.h>

#define _MAX 1000
#define _MAX_LENGTH 30

struct triangle
{
	char name[_MAX_LENGTH];
	long znamenatel;
};

int n;
long obsht_znamenatel;
int isAllowed[_MAX];
struct triangle input[_MAX];

int calculateSurface(struct triangle input)
{
	int i;
	int l = strlen(input.name);
	long temp = 4;
	for (i = 1; i < l; i++) temp *= 4;
	return temp;
}

int isSubString(char name1[], char name2[_MAX_LENGTH])
{
	int i = 0;
	int l = strlen(name1);
	int result = 1;
	for (i = 0; i < l; i++) if (name1[i] != name2[i]) result = 0;
	return result;
}

void init(void)
{
	int i;
	obsht_znamenatel = 1;
	scanf("%d", &n);
	for (i = 0; i < n; i++) isAllowed[i] = 1;
	for (i = 0; i < n; i++)
	{
		int j;
		scanf("%s", &input[i].name);
		for (j = 0; j < i; j++)
		{
			if (isSubString(input[j].name, input[i].name))
			{
				isAllowed[i] = 0;
				break;
			}
		}
		if (isAllowed[i])
		{
			input[i].znamenatel = calculateSurface(input[i]);
			if (obsht_znamenatel < input[i].znamenatel)
			{
				obsht_znamenatel *= input[i].znamenatel;
			}
		}
	}
}

void calculateChislitel(void)
{
	int i;
	long result1 = 0;
	long result2 = obsht_znamenatel;
	for (i = 0; i < n; i++)
	{
		if (isAllowed[i])
		{
			if (obsht_znamenatel != input[i].znamenatel)
			{
				result1 += 1 * (obsht_znamenatel / input[i].znamenatel);
			}
			else
			{
				result1++;
			}
		}
	}
	while (result2 % 2 == 0 && result1 % 2 == 0 && result1 != 1)
	{
		result1 /= 2;
		result2 /= 2;
	}
	printf("%d %d\n", result1, result2);
}

void solve(void)
{
	calculateChislitel();
}

int main(void)
{
	init();
	solve();
	
	return 0;
}
