Harflerin Değeri#11610

Harflerin Değeri (Editoryal)

Metni satır satır işleyeceğiz. Satırlar boşluk ve diğer herhangi bir karakteri içerebileceğinden, her satırı getline fonksiyonuyla tamamen okuyoruz. Girdi verisinin sonuna kadar okumaya devam ediyoruz — satır sayısı önceden bilinmiyor.

Her satırda karakterleri sırayla geziyoruz. Eğer mevcut karakter büyük bir Latin harfi ise, yani '' ≤ ≤ '', o zaman onun maliyeti s[i] - 'A' + 1'e eşittir: '' harfinin maliyeti , '' harfinin maliyeti , ..., '' harfinin maliyeti 'dır. Diğer tüm karakterleri (küçük harfler, rakamlar, noktalama işaretleri, boşluklar) atlıyoruz.

Aranan çarpımı değişkeninde biriktireceğiz. Başlangıçta res = 1 olarak alıyoruz. Metinde hiç büyük Latin harfi yoksa bu değer aynı zamanda cevap olacaktır.

Maliyetlerin çarpımı hızla çok büyük hale geldiğinden, her çarpma işleminden sonra 10^9 + 7 modülüne göre kalanı alacağız.

Örnek

Verilen örnekte aşağıdaki büyük Latin harfleri bulunmaktadır:

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

Harflerin maliyeti parantez içinde belirtilmiştir. Tüm maliyetlerin çarpımı şuna eşittir:

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

Algoritmanın Gerçekleştirilmesi

Çarpımı hesaplayacağımız modülü tanımlayalım.

#define MOD 1000000007

Aranan çarpımı değişkeninde hesaplayacağız. Başlangıçta ona değerini atayalım.

res = 1;

Girdi verisinin sonuna kadar metni satır satır okuyoruz.

while (getline(cin, s))
{

Mevcut satırının karakterlerini geziyoruz.

  for (i = 0; i < s.size(); i++)
  {

Eğer mevcut karakter büyük bir Latin harfi ise, onun maliyeti 'yi hesaplıyoruz ve 'i ile çarpıp 'a göre kalanını alıyoruz.

    if (('A' <= s[i]) && (s[i] <= 'Z'))
    {
      c = s[i] - 'A' + 1;
      res = (res * c) % MOD;
    }
  }
}

Cevabı yazdırıyoruz.

cout << res << endl;