В разведывательное управление доставили сейф с секретной информацией, кодовый замок на котором открывается комбинацией из nn цифр, каждая цифра может принимать b различных значений от 0 до b−1. Код неизвестен, однако разведчики передали несколько донесений о том, что сумма цифр кода в некоторых заданных позициях равна какому‑то известному числу. Используя информацию из всех полученных донесений, определите, сколько существует возможных кодов, удовлетворяющих этим условиям.
Формат входных данных
Первая строка входных данных содержит число b количество различных значений одной цифры кода, 2≤b≤10.
Вторая строка содержит число n количество цифр в коде, n≥1, bn≤60000.
Третья строка содержит число t количество имеющихся донесений о сумме каких‑то цифр кода, t≥1.
Следующие 2t строк содержат информацию об имеющихся донесениях. Каждое донесение состоит из двух строк. Первая из этих строк («маска цифр») содержит nn символов, записанных слитно и равных «0» или «1», где цифра «1» обозначает, что в донесении говорится об этой цифре кода. Например, маска цифр «01011» означает сумму цифр, стоящих коде на 2-й, 4-й и 5-й позициях. Во второй строке донесения записано число s, равное сумме цифр кода, стоящих на данных позициях.
Гарантируется, что каждая маска цифр содержит хотя бы одну единицу и что все маски цифр различаются. Общее число донесений может быть любым, удовлетворяющим этим условиям.
Формат выходных данных
Программа должна вывести одно целое число количество различных кодов, которые удовлетворяют всем донесениям.
Система оценки
Решения, правильно работающие, когда n≤4 и каждая маска цифр содержит ровно один символ «1», будут оцениваться в 28 баллов.
Решения, правильно работающие, когда n≤4, будут оцениваться в 64 балла.
Замечание
В примере из условия каждая цифра кода может принимать 8 различных значений от 0 до 7; код состоит из 3 цифр. Получено 2 донесения, из первого донесения известно, что сумма первой и второй цифр кода равна 7, из второго донесения известно, что сумма второй и третьей цифр кода равна 12. Существуют 3 кода, удовлетворяющие этим условиям: «075», «166», «257».
by ChatGPT (первый ввод-вывод работает) import itertools
def check_report(code, masks, sums):
# Проверка всех донесений для данного кода
for mask, sum_value in zip(masks, sums):
current_sum = sum(code for i in range(len(code)) if mask == '1'
if current_sum != sum_value:
return False
return True
def count_valid_codes(b, n, masks, sums):
# Генерация всех возможных кодов
valid_codes = 0
all_codes = itertools.product(range(b), repeat=n)
for code in all_codes:
if check_report(code, masks, sums):
valid_codes += 1
return valid_codes
def main():
# Ввод данных
b = int(input())
n = int(input())
t = int(input())
masks = []
sums = []
for _ in range(t):
mask = input().strip()
s = int(input())
masks.append(mask)
sums.append(s)
# Подсчет количества валидных кодов
result = count_valid_codes(b, n, masks, sums)
print(result)
def count_codes(b, n, t, reports):
from itertools import product
# Список для хранения ограничений
constraints = []
for i in range(t):
mask = reports[2 * i]
sum_value = int(reports[2 * i + 1])
positions = [j for j in range if mask[j] == '1']
constraints.append((positions, sum_value))
valid_codes_count = 0
# Перебираем все возможные комбинации кодов
for code in product(range(b), repeat=n):
valid = True
for positions, sum_value in constraints:
if sum(code[pos] for pos in positions) != sum_value:
valid = False
break
if valid:
valid_codes_count += 1
return valid_codes_count
# Ввод данных
b = int(input())
n = int(input())
t = int(input())
reports = [input().strip() for _ in range(2 * t)]
# Вычисление количества кодов
result = count_codes(b, n, t, reports)
print(result)
from itertools import product
b = int(input())
p = int(input())
t = int(input())
c = []
for _ in range(t):
m = input().strip()
s = int(input().strip())
c.append((m, s))
r = 0
for x in product(range(b), repeat=p):
valid = True
for m, s in c:
if sum(x for i in range(p) if m == '1' != s:
valid = False
break
if valid:
r += 1
print(r)