#include using namespace std; const int N = 100100; char s[N]; int cnt[26][N]; const long long mod = 1e9 + 7; int main() { for (int n, t = 1; ~scanf("%d", &n); t++) { memset(cnt, 0, sizeof(cnt)); int maxlen = 0; bool vis[26] = {false}; bool vis2[26] = {false}; for (int _ = 0; _ < n; _++) { scanf("%s", s); vis2[*s - 'a'] = true; int len = strlen(s); maxlen = max(len, maxlen); for (int i = 0; i < len; i++) cnt[s[len - i - 1] - 'a'][i]++, vis[s[len - i - 1] - 'a'] = true; } set S; for (int i = 0; i < 26; i++) if (vis[i] && !vis2[i]) S.insert(i + 'a'); maxlen += 10; for (auto &i : cnt) for (int j = 0, *arr = i; j < maxlen; j++) arr[j + 1] += arr[j] / 26, arr[j] %= 26; /*for (int i = 0; i < 26; i++) { printf("%c", 'a' + i); for (int j = 0; j < maxlen; j++) printf(" %d", cnt[i][j]); putchar('\n'); }*/ pair res[26]; for (int i = 0; i < 26; i++) res[i] = make_pair('a' + i, cnt[i]); sort(res, res + 26, [maxlen](const pair &lhs, const pair &rhs) { for (int i = maxlen; i >= 0; i--) { if (lhs.second[i] < rhs.second[i]) return true; if (lhs.second[i] > rhs.second[i]) return false; } return false; }); if (vis2[res[0].first - 'a']) for (auto &re : res) if (S.count(re.first)) { swap(res[0], re); break; } /*for (auto &re : res) { printf("%c ", re.first); for (int j = 0; j < maxlen; j++) printf("%d ", re.second[j]); putchar('\n'); }*/ long long ans = 0, base = 1; for (int i = 0; i < maxlen; i++, base = base * 26 % mod) for (int j = 0; j < 26; j++, ans %= mod) ans += j * base * res[j].second[i]; printf("Case #%d: %lld\n", t, ans); } return 0; }