import enum def count_inversions(seq: str)-> int: inversions = 0 count = 0 for i, c in enumerate(seq): if c == '0': inversions += i - count count += 1 return inversions class sequence_generator: def __init__(self, seq: str): self._seq = seq self.qpos = [] for i, c in enumerate(seq): if c == '?': self.qpos.append(i) def __iter__(self): self.max = pow(2, len(self.qpos)) self.current = 0 return self def __next__(self): if self.current < self.max: new_seq = self._seq bstr = "{0:b}".format(self.current) bstr = "".join(("0" * (len("{0:b}".format(self.max)) - len(bstr) - 1), bstr)) for i, c in enumerate(bstr): new_seq = f"{new_seq[:self.qpos[i]]}{c}{new_seq[self.qpos[i]+1:]}" self.current += 1 return new_seq raise StopIteration seq = input() if "?" not in seq: sum = count_inversions(seq) else: s = sequence_generator(seq) sum = 0 for x in s: sum += count_inversions(x) print(sum % 1000000007)