AT3589 Similar Arrays 题解

Content

给定一个长度为 \(n\) 的序列 \(a\)。定义两个序列 \(x,y\) 是相似的,当且仅当 \(\forall i\in[1,n],|x_i-y_i|\leqslant 1\)。请你求出有多少个序列 \(b\),使得:

  • 序列 \(a,b\) 相似。
  • 序列 \(b\) 的所有数的乘积为偶数。

数据范围:\(1\leqslant n\leqslant 10\)\(1\leqslant a_i\leqslant 100\)

Solution

根据题意我们不难发现,对于序列 \(b\) 每一个位置上面的数,其与对应位置上序列 \(a\) 的数的差仅可能为 \(-1,0,1\) 这三种。因此,我们不妨设 \(c_i=b_i-a_i\),然后直接枚举所有 \(c_i\) 可能的值的情况。由于 \(n\) 很小,因此我们的 \(\mathcal O(3^n)\) 做法可以毫无压力地跑过去。

Code

namespace Solution {
	int n, ans, a[17], b[17];
	
	iv dfs(int x) {
		if(x > n) {
			int fl = 0;
			F(int, i, 1, n) if(!((a[i] + b[i]) & 1)) {fl = 1; break;}
			ans += fl;
			return;
		}
		F(int, i, -1, 1) b[x] = i, dfs(x + 1);
	}
	
	iv Main() {
		read(n); F(int, i, 1, n) read(a[i]);
		dfs(1), println(ans);
		return;
	}
}
posted @ 2021-12-15 21:07  Eason_AC  阅读(42)  评论(0)    收藏  举报