P6616 环 Rings

题目背景

> 一九二九不出手,三九四九冰上走,五九六九隔河看杨柳; > > 七九河开,八九雁来,九九加一九,耕牛遍地走。 「九」自古以来就是一个奇妙的数字,而你今天要解决的问题,也与「九」有关。

题目描述

你有一个 $n$ 连环,和你熟知的九连环有着相同的结构。 ![这是一个九连环](https://cdn.luogu.com.cn/upload/image_hosting/x68krf0v.png) > 上图是一个九连环。 顾名思义,$n$ 连环有一个长长的横梁,上面挂着 $n$ 个 **彼此影响** 的环。 我们给这 $n$ 个环编号,其中最靠横梁头部的环为第 $1$ 个环,其次为第 $2$ 个环,以此类推……最靠横梁尾部的环为第 $n$ 个环; 定义 $f_i$ 表示第 $i$ 个环的状态,其中 $f_i = 1$ 表示这个环在横梁上,$f_i = 0$ 表示这个环不在横梁上; 定义 **拆装一个环** 为使环的状态 **取反**,即状态从 $1$ 变成 $0$ 或从 $0$ 变成 $1$。 这些环的合法拆装规则如下: 1. 第 $1$ 个环随时可以单独拆装; 2. 第 $k+1$ 个环可以单独拆装,当且仅当 $f_k=1$ 且 $\forall i < k$,都有 $f_i = 0$; 3. 若 $f_1 = f_2$,则第 $1,2$ 两个环可以一起拆装。 现在你需要解决的问题是:已知一个 $n$ 连环的初始状态,请你求出拆除这个 $n$ 连环的最少拆装步数。

输入格式

本题数据量较大,故采取 **特殊** 输入方式。 第一行一个正整数 $n$。 第二行一个正整数 $m$; 接下来 $m$ 行输入描述了初始状态: 第 $i + 2$ 行有两个整数 $len_{i}, st_{i}$,表示往初始的 $n$ 连环的尾部连续添加 $len_{i}$ 个状态为 $st_{i}$ 的环。

输出格式

一行共一个整数,表示从拆下这个 $n$ 连环所需要的最少拆装次数。 由于答案可能很大,你只需要输出答案对 $1201201201$ 取模后的结果。

说明/提示

本题采用 **捆绑测试**,开启 **O2优化**。 $\text{Subtask 1 (10 pts)}:$ 保证 $1 \le n \le 20$; $\text{Subtask 2 (15 pts)}:$ 保证 $1 \le n\le 1000$; $\text{Subtask 3 (15 pts)}:$ 保证初始状态中 **只有** $1$ 个 $1$; $\text{Subtask 4 (30 pts)}:$ 保证 $1 \le n \le 10^7$; $\text{Subtask 5 (30 pts)}:$ 没有特殊限制。 对于所有数据,满足 $1 \le n \le 10^{18}$,$1 \le m \le 10^5$,$st_{i} \in \{0, 1\}$,$len_{i} \ge 1$ 数据保证 $\sum\limits_{i=1}^m len_{i} = n$。 --- #### 样例 #1 解释 样例描述的是 $4$ 连环,初始状态为 `1101`。 用最少合法拆装次数完成的方法如下: ```plain 1. 1101 -> 1100 2. 1100 -> 0100 3. 0100 -> 0111 4. 0111 -> 0110 5. 0110 -> 0010 6. 0010 -> 0011 7. 0011 -> 0000 ``` 共 $7$ 步。 --- #### 题外话 本题中 $n$ 连环的第 $3$ 条拆装规则,在大部分的九连环玩法说明中都没有提到,但它确实是一个真实可行的操作呢!