说明
以下任务是第 16 届波兰信息学奥林匹克第三阶段任务“Words”的一个显著更难的版本。它并未在比赛中使用,而是为那些解决了“Words”并想要更多挑战的人提供的扩展。令 f 是一个作用于由数字 0 和 1 组成的字符串的函数。
函数 f 将字符串 s 转换为通过独立且同时地将每个数字 0 替换为 1,并将每个数字 1 替换为字符串 10。
例如,f(0)=1,f(1)=10(即 f 将空字符串映射为空字符串)。
注意,f 是一个单射,即一对一函数。
我们用 fn 表示函数 f 自身复合 n 次。
特别地,f0 是恒等函数 id。
我们对形如 fn(0) 的字符串感兴趣,其中 n≥0。这个序列以以下字符串开始:
f0(0)=0,f1(0)=1,f2(0)=10,f3(0)=101,f4(0)=10110,f5(0)=10110101。
如果字符串 u 作为一个连续(即单块)子序列出现在字符串 v 中,我们称字符串 u 是字符串 v 的子串。
给定一个整数序列 a1,a2,…,ak。
你的任务是检查形如 fa1(0)⋅fa2(0)⋯fan(0) 的字符串是否是 fn(0) 的子串,对于某个 n≥0,如果是,你需要找到最小的这样的 n。
输入格式
标准输入的第一行包含一个整数 k,1≤k≤106。
标准输入的第二行包含 k 个非负整数 a1,a2,…,ak(0≤ai≤109),以单个空格分隔。
输出格式
你的程序应输出一行,输出最小的非负整数 n,使得 fai(0) 是 fn(0) 的子串,或者如果这样的 n 不存在,则输出 NIE(波兰语中的“否”)。
2
1 2
4
提示
题面翻译由 ChatGPT-4o 提供。