CF 2178 I

首先对于距离为 \(\sqrt{k}\) 的点进行连边,可以连成一个图。考察这个图的性质,发现是二分图。(*)

证明:平常这个就是用奇偶性证明的。所以立刻知道 \(k\) 奇数的时候,可以把格点黑白染色证明。具体的,如果 \((x_1-x_2)^2+(y_1-y_2)^2\equiv 1\pmod{2}\),则 \(|x_1-x_2|+|y_1-y_2|=1\pmod{2}\)

如果 \(k\) 是偶数,考虑用“归纳”的方法,把 \(k\) 变成奇数。那么尝试给 \(k\gets \frac{k}{2}\)。套路的,\((x,y)\rightarrow (\frac{x+y}{2},\frac{x-y}{2})\) 即可,容易发现坐标仍然是整数。

观察数据范围,感觉会有一个 \(3^{31/2}\) 状物。一种折半的感觉,干脆枚举一下二分图中点数少的一边是什么状态。设为 \(A\) 集合,另一边是 \(B\) 集合。在 \(T\) 中为 \(1\),否则为 \(0\)

这个时候,\(B\) 集合的点已经确定贡献了,但是 \(A\) 集合的点得在 \(B\) 确定后才能确定贡献。但是显然不能枚举,所以考虑“拆开”,用 product trick(**)转化为从相邻的被选择的点中选出 \(0/1\) 个点。那么就可以 \(B_{i=1\sim cnt}\) 的时候把一些没有选择的 \(A\) 点,放入已经选择的点中。

具体的,设 \(f_{i,msk}\)\(B_{1}\sim B_i\) 的贡献确定,\(A\) 集合 \(msk\) 中的点已经选择,的总贡献乘积和。有两种转移:

  • \(B_{i+1}=0\)。那么 \(f_{i+1,msk}\gets f_{i+1,msk}+f_{i,msk}\times (1+deg)\),其中 \(deg\) 是和 \(B_{i+1}\) 相邻的 \(A=1\) 的个数。

  • \(B_{i+1}=1\)。那么 \(f_{i+1,msk|s}\gets f_{i+1,msk|s}+f_{i,msk}\),其中 \(s\) 是一个和 \(B_{i+1}\) 相邻的子集,并且满足 \(s\cap msk=0\)

发现第二个转移是高位前缀和的形式,所以总复杂度 \(\mathcal{O}(3^{|A|}|A||B|)\) 的。


怎么想到的啊?

(*)可能是因为条件很苛刻,其实感觉很难形成环。发现其实正方形是容易的,但是正三角形是难的。还有就是,没有任何特殊条件,感觉不可做。

(**)一步一步确定的时候应该是很套路的,相当于赋予第二个意义。

posted @ 2026-06-24 11:30  _Iroha  阅读(9)  评论(0)    收藏  举报