[AGC043B] 123 Triangle
Description
- 一个长度为 \(n\) 的仅包含
123
的序列 \(a\)。 - \(f_{k,x}=|f_{k-1,x}-f_{k-1,x+1}|(k>1)\), \(f_{1,i}=a_i\)。
- 求 \(f_{n,1}\)
- \(2 \le n \le 10^6\),\(a_i \in \{1,2,3\}\)
Solution
考虑 \(ans \in \{0, 1, 2\}\),因此先将 \(a\) 全部 \(-1\)。
先考虑几个性质:
- \(1\) 或 \(2\) 遇到 \(0\) 不会有任何影响。
- \(1\) 遇到 \(2\) 会变为 \(1\)。
在此基础上讨论答案:
- \(ans = 1\),\(1\) 对答案的贡献为奇数。
- \(ans = 2\),\(2\) 对答案的贡献为奇数,且没有 \(1\) 存在。
- \(ans = 0\),其他情况。
可以发现,只用考虑 \(1,2\) 对答案贡献的奇偶性, 原式可化为:\(f_{k,x}=f_{k-1,x}+f_{k-1,x+1}\)
显然杨辉三角, \(a_i\) 对答案的贡献为 \(\binom{n-1}{i-1}\)。
另外,关于 \(\binom{n}{m}\) 的奇偶性可用 \(Lucas\) 定理推导,即验证 \(n\&m=m\)。
Code
cin >> n >> (s + 1);
rep(i, 1, n) a[i] = s[i] - '1', p[a[i]] = 1, f[a[i]] ^= (((i - 1) & (n - 1)) == i - 1);
cout << (f[1] ? 1 : (f[2] && !p[1]) * 2);