做此题前请自行科普一下 bitset。
大概就是一个状态压缩的东西。
这题很强势啊……
Orz lxl!
我们设 cnt1 表示每个数是否存在的 bitset,设 cnt2 表示 cnt1 整体反转的结果。
操作 1 相当于判断是否存在 y−z=x,也就是是否同时存在 y 与 y−x。
这个比较简单,用 cnt1 与其左移 x 位的结果按位与,如果结果 >0 则存在。
操作 2 相当于判断是否存在 y+z=x。
对于任意整数 w,我们设 w′ 表示 cnt2 中 w 存储的位置,即 c−w。
那么
y+z=xy+c−z′=xy+c=x+z′z′=y+c−x
也就是是否同时存在 y 与 (y+c−x)′。 所以把 cnt1 与 cnt2 右移 c−x 位的结果按位与,如果结果 >0 则存在。
操作 3?暴力枚举两个因数啊!反正 O(√ai) 随便跑。
代码:
1 |
|