Будемо обробляти текст рядок за рядком. Оскільки рядки можуть містити пробіли та будь-які інші символи, кожний рядок читаємо цілком функцією getline. Читання продовжуємо до кінця вхідних даних — кількість рядків заздалегідь не відома.
У кожному рядку перебираємо символи по черзі. Якщо поточний символ є великою латинською літерою, тобто '' ≤ ≤ '', то його вартість дорівнює s[i] - 'A' + 1: літера '' має вартість , '' – , ..., '' – . Усі інші символи (малі літери, цифри, розділові знаки, пробіли) пропускаємо.
Шуканий добуток будемо накопичувати в змінній . Спочатку покладемо res = 1. Воно ж буде відповіддю, якщо в тексті немає жодної великої латинської літери.
Добуток вартостей швидко стає величезним, тому брати остачу за модулем 10^9 + 7 будемо після кожного множення.
Приклад
У заданому прикладі наявні такі великі латинські літери:
Вартість літер вказана в дужках. Добуток усіх вартостей дорівнює
Реалізація алгоритму
Визначимо модуль, за яким будемо обчислювати добуток.
#define MOD 1000000007Шуканий добуток будемо обчислювати в змінній . Спочатку присвоїмо їй значення .
res = 1;Читаємо текст рядок за рядком до кінця вхідних даних.
while (getline(cin, s))
{Перебираємо символи поточного рядка .
for (i = 0; i < s.size(); i++)
{Якщо поточний символ є великою латинською літерою, то обчислюємо його вартість і множимо на за модулем .
if (('A' <= s[i]) && (s[i] <= 'Z'))
{
c = s[i] - 'A' + 1;
res = (res * c) % MOD;
}
}
}Виводимо відповідь.
cout << res << endl;