#377. [R60E]折叠
[R60E]折叠
时空限制
2S/512M
题目描述
apiadu 有一张纸条,他想对这张纸条进行折叠操作。
初始时,纸条的长度为 ,上面共有 条折痕,从左到右编号为 。折痕均匀分布在纸条上,具体来说,相邻两条折痕之间的距离为 ,第 条折痕距离纸条左侧边缘的距离也为 ,第 条折痕距离纸条右侧边缘的距离也为 ,每条折痕要么朝里,要么朝外。
当折叠操作进行到任意时刻时,都可以保证折痕依旧均匀分布在纸条上,假设此时纸条的长度为 ,上面有 条折痕,则折痕的方向可以用一个只包含 和 的序列 来表示,对于 (),如果 ,则第 条折痕朝里,否则第 条折痕朝外。
apiadu 想把通过折叠操作,把纸条的长度折成 ,他可以进行的折叠操作如下:
- 假设现在纸条的长度为 ,折痕方向的序列为 ,
apiadu可以选择一个正整数 满足 ,并且对于所有 (),满足 ,他会将纸条沿第 条折痕折叠,折叠后,纸条会按如下方式变化:- 如果 ,则折叠后纸条长度会变为 ,上面有 条均匀分布的折痕,纸条的折痕方向序列会变为 。特别地,当 且 时,折叠后纸条长度变为 ,折痕数量变为 。
- 如果 ,则折叠后纸条长度会变为 ,上面有 条均匀分布的折痕,纸条的折痕方向序列会变为 。
请帮助可爱的 apiadu 求出最少需要进行多少次折叠操作,才能使纸条长度变为 。
格式
输入格式
第一行包含一个整数 ,表示初始时纸条长度为 ,上面有 条折痕。
第二行包含 个整数 ,表示初始时的折痕方向序列。
输出格式
输出一行一个整数,表示最少需要进行的操作次数。
样例
样例输入 #1
4
0 1 1 0
样例输出 #1
3
样例解释 #1
以下是一种可行的操作方案:
第 次操作:选择 ,操作后折痕方向序列会变成 。
第 次操作:选择 ,操作后折痕方向序列会变成 。
第 次操作:选择 ,操作后纸条长度变为 ,折痕数量为 。
可以证明不存在所需操作次数小于 的操作方案。
样例输入 #2
5
0 1 0 1 0
样例输出 #2
5
样例输入 #3
6
0 1 1 0 1 1
样例输出 #3
3
数据规模
注意:你只有通过了子任务的所有测试点,才能获得对应子任务的分数。
| 子任务编号 | 分数 | |
|---|---|---|
对于 的数据,,。
Related
In following contests: