Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Сдать решение задачи C-SHA-57
- Полный балл: 100
- Бонусные баллы:
- Имя входного файла: in.txt или стандартный поток ввода
- Имя выходного файла: out.txt или стандартный поток вывода
- Ограничение времени: 1 с
- Ограничение памяти: 512M
- SHA-57
- Вы проникли в тестирующую систему своей школы, и теперь вам осталось только узнать пароль отличника Вани, чтобы списать у него решение задачи. Только вот проблема: пароль хранится в захешированном виде.
- Алгоритм SHA-57 работает так:
- изначально hash равен 0
- После этого к хешу добавляются символы пароля слева направо. При добавлении символа chr новое значение hash равняется ((hash × 57) ⊕ ord(chr)) mod (2M)
- Здесь ⊕ - побитовое исключающее ИЛИ, mod - операция взятия остатка по модулю, ord(chr) - номер буквы в английском алфавите: ord(a)=1, ord(b)=2, ..., ord(z)=26. В пароле могут быть только маленькие английские буквы.
- Вам нужно определить, сколько различных паролей длины n из маленьких английских букв имеют значение хеша h.
- Формат входных данных
- В единственной строке ввода вам даётся через пробел 3 числа: n, M, h (1 ≤ n ≤ 10, 2 ≤ M ≤ 25, 0 ≤ h < 2M) - длина пароля, число M из функии подсчёта хеша и хеш пароля.
- Формат результата
- Выведите одно число - количество паролей длины n, которые имеют хеш h.
- Примеры
- Входные данные
- 1 3 1
- Результат работы
- 4
- Входные данные
- 3 14 10694
- Результат работы
- 3
- Входные данные
- 3 5 0
- Результат работы
- 547
- Примечания
- Буквы английского языка по порядку: abcdefghijklmnopqrstuvwxyz
- Рассмотрим подсчёт SHA-57 для строки "hse" и M = 14:
- Для строки "h": ((0 × 57) ⊕ 8) mod (214) = 8
- После добавления "s": ((8 × 57) ⊕ 19) mod (214) = 475
- Для итоговой строки "hse": ((475 × 57) ⊕ 5) mod (214) = 10694
- Для n = 3, M = 14 хеш 10694 имеют 3 пароля: "cwz", "hse", "rxl". Поэтому ответ во втором примере равен 3.*/
Advertisement
Add Comment
Please, Sign In to add comment