diff --git a/sequences.py b/sequences.py new file mode 100644 index 0000000..d2817fc --- /dev/null +++ b/sequences.py @@ -0,0 +1,47 @@ +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)