Mətni sətir-sətir emal edəcəyik. Sətirlər boşluqlar və digər istənilən simvolları ehtiva edə biləcəyindən, hər sətri tam şəkildə getline funksiyası ilə oxuyuruq. Oxuma giriş məlumatlarının sonuna qədər davam etdirilir — sətirlərin sayı əvvəlcədən məlum deyil.
Hər sətirdə simvolları növbə ilə nəzərdən keçiririk. Əgər cari simvol latın əlifbasının böyük hərfidirsə, yəni '' ≤ ≤ '', onda onun dəyəri s[i] - 'A' + 1-ə bərabərdir: '' hərfinin dəyəri , 'B'-nin – , ..., 'Z'-nin – -dır. Qalan bütün simvolları (kiçik hərflər, rəqəmlər, durğu işarələri, boşluqlar) buraxırıq.
Axtarılan hasili dəyişənində toplayacağıq. Əvvəlcə res = 1 qəbul edək. Əgər mətndə heç bir böyük latın hərfi yoxdursa, bu, cavab olacaq.
Dəyərlərin hasili tez bir zamanda çox böyük olur, buna görə də hər vurmadan sonra 10^9 + 7-yə görə qalığı götürəcəyik.
Misal
Verilmiş misalda aşağıdakı böyük latın hərfləri mövcuddur:
Hərflərin dəyəri mötərizələrdə göstərilib. Bütün dəyərlərin hasili bərabərdir:
Alqoritmin reallaşdırılması
Hasili hesablayacağımız modulu təyin edək.
#define MOD 1000000007Axtarılan hasili dəyişənində hesablayacağıq. Əvvəlcə ona qiyməti mənimsədirik.
res = 1;Giriş məlumatlarının sonuna qədər mətni sətir-sətir oxuyuruq.
while (getline(cin, s))
{Cari sətrinin simvollarını növbə ilə nəzərdən keçiririk.
for (i = 0; i < s.size(); i++)
{Əgər cari simvol latın əlifbasının böyük hərfidirsə, onda onun dəyərini hesablayırıq və -i üzrə -yə vururuq.
if (('A' <= s[i]) && (s[i] <= 'Z'))
{
c = s[i] - 'A' + 1;
res = (res * c) % MOD;
}
}
}Cavabı çap edirik.
cout << res << endl;