Вартість літер#11610

Вартість літер (Розбір)

Будемо обробляти текст рядок за рядком. Оскільки рядки можуть містити пробіли та будь-які інші символи, кожний рядок читаємо цілком функцією getline. Читання продовжуємо до кінця вхідних даних — кількість рядків заздалегідь не відома.

У кожному рядку перебираємо символи по черзі. Якщо поточний символ є великою латинською літерою, тобто '' ≤ ≤ '', то його вартість дорівнює s[i] - 'A' + 1: літера '' має вартість , '' – , ..., '' – . Усі інші символи (малі літери, цифри, розділові знаки, пробіли) пропускаємо.

Шуканий добуток будемо накопичувати в змінній . Спочатку покладемо res = 1. Воно ж буде відповіддю, якщо в тексті немає жодної великої латинської літери.

Добуток вартостей швидко стає величезним, тому брати остачу за модулем 10^9 + 7 будемо після кожного множення.

Приклад

У заданому прикладі наявні такі великі латинські літери:

E (5), V (22), I (9), U (21), S (19), A (1)

Вартість літер вказана в дужках. Добуток усіх вартостей дорівнює

(5 ∗ 22 ∗ 9 ∗ 21 ∗ 19 ∗ 1) \mod 1000000007 = 395010

Реалізація алгоритму

Визначимо модуль, за яким будемо обчислювати добуток.

#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;