AGC047

*C:Product Modulo
fft...不会...


*D:Twin Binary Trees
先手玩吧。。。其实是每一对叶子都会有一条路径。
我试图寻找一种使用乘法和加法原理的实现方式。
tmd,考虑暴力是 \(2^DD^2\) 的。但是,很多组点他们在两个树中的 lca 都是一样的。不妨合并计算。(找出一个具象的 key)
具体来说,枚举叶子节点。向上跳。处理出 \(dp[i][j]\)\(i\) 是上面那棵树的节点,\(j\) 是下面那棵树的节点)由于必须要通过一条直链连接,所以 \((i,j)\) 的数量级是 \(2^DD^2\) 的。你在算 \(dp\) 数组的时候动态计算即可。


E:Product Simulation

image

“造计算机题”。本题可以加深对加减法和逻辑表达式的理解。

首先二进制拆分很容易想到。尝试构造出一个 \(A\)。那么\(A=\sum_{i=29}^{i\geqslant 0}[A\geqslant 2^i+tmp]2^i\)。其中 \(tmp\) 表示当前的 \(\sum 2^i\)\(tmp\) 的设立是因为我们没有减法操作,所以就移个项将 \(A-2^i\) 变成 \(tmp+a_i\)

注意到我们需要类似 \(a\geqslant b\) 这样的操作。但是操作 \(2\) 不能取等。所以上式等价于 \(a+1>b\)。所以我们需要一个 \(1\)。但其实 \(1=[a+b>0]\)。因为如果 \(a+b=0\) 那么答案也是 \(0\),也没什么影响。

同理我们可以构造出一个 \(B\)。这样我们就分别得到了对于每一个二进制位,\(A\)\(B\) 二进制拆分后到底有没有它。

考虑将答案合并。\(ans=\sum _{i=1}^{29}\sum_{j=1}^{29}(k_{1i}\ \&\ k_{2j})2^{i+j}\)。其中 \(k\) 表示 \(A\)\(B\) 有没有这个二进制位。

发现 \(k_{1i}\ \&\ k_{2j} = [1<k_{1i}+k_{2j}]\)。(妙!)

于是,我们可以便可以通过这两个操作实现 \(A\times B\)

补:其实我最开始想的是二进制拆分套二进制拆分,本质上应该差不多。

posted @ 2022-11-06 20:17  Saintex  阅读(25)  评论(0编辑  收藏  举报