0%

2025 CCPC 郑州——G. Plus Xor( n 方复杂度,要想到记忆化 bfs 搜索)(记忆化 bfs 最重要的就是确定状态)(异或 b 只能改变 __lg(b)+1 位)(采用塞入的时候确定答案的,应该采用一 check/is_find_ans 函数,确保初始塞入情况和中途塞入情况采用同样的判断逻辑)

题目大意

题目描述
给定三个整数 a,b,ca, b, c,每次可以选择执行以下两种操作之一:

  1. aa+ba \leftarrow a + b

  2. aaba \leftarrow a \oplus b\oplus 为按位异或运算)

你可以执行任意次上述操作。请判断最终是否能将 aa 变为 cc

输入格式
第一行为测试数据组数 TT1T1031 \le T \le 10^3)。
接下来 TT 行,每组数据包含三个整数 a,b,ca, b, c0a,c10180 \le a, c \le 10^{18}1b10001 \le b \le 1000)。
保证在一个测试点内 b2106\sum b^2 \le 10^6

输出格式
对于每组数据,如果最终能将 aa 变为 cc,输出 YES,否则输出 NO

样例数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
输入:
5
1 6 7
7 5 13
8 3 16
7 6 17
2 7 8

输出:
YES
NO
YES
YES
NO

样例解释

  • 第一组数据 1 6 7:初始 a=1a=1,执行一次加法操作 1+6=71 + 6 = 7,即可得到 c=7c=7,输出 YES

  • 第二组数据 7 5 13:无法通过进行 +5+55\oplus 5 操作从 77 得到 1313,输出 NO

  • 第三组数据 8 3 16:初始 a=8a=8,执行路线可为:
    8311+314313+3168 \xrightarrow{\oplus 3} 11 \xrightarrow{+3} 14 \xrightarrow{\oplus 3} 13 \xrightarrow{+3} 16,最终得到 c=16c=16,输出 YES

  • 第四组数据 7 6 17:初始 a=7a=7,执行路线可为:
    7+613611+6177 \xrightarrow{+6} 13 \xrightarrow{\oplus 6} 11 \xrightarrow{+6} 17,最终得到 c=17c=17,输出 YES

  • 第五组数据 2 7 8:无法通过操作从 22 得到 88,输出 NO

思路讲解

2025 ICPC Asia Manila Regional(2025 ICPC 马尼拉)——vp 中通过题目总结(把题目对取模的要求用注释写在末尾)

收到这场比赛的题目 E. Long Distance Examination(远程操作克隆机器人,两人在不同迷宫中,B 尽力复刻 A 的所有操作)的启发,我们决定重新把这道题目给再盘一盘。

其实说白了,这道题目也很简单,虽然说数字可能很大,但是,我们可以只关注在 (modb)\equiv\pmod b 的值,我们以这个为状态,进行记忆化 bfs,自然是非常少的(状态数)。

记忆化 bfs 最重要的就是确定状态**。**

当然,光有一个目前 mod b 的值是不够的,我们还需要再确定一个状态。

注意到,mod b 的值,是和这个 +b 相关的一个状态,这个提示我们,要采用一个和异或 b 相关的这个值,作为这个状态的组成部分。

注意到,异或 b 只能改变后 __lg(b)+1 位

因此,最后 __lg(b)+1 位,确定了异或 b 操作能够增长(或减小的值)。再加上 mod b 的值,就唯一确定了这个状态。因为起点确定了,增长的值也确定了,那就什么都确定了。(这个是因为异或具有不可重复操作性,操作偶数次等于不操作,操作奇数次等于操作一次)

1
2
3
4
5
6
7
struct ModB_Low_bit {
ll mod_b,low_bit,origin;
bool operator<(const ModB_Low_bit &o) const {
if (o.mod_b!=mod_b) return mod_b<o.mod_b;
return low_bit<o.low_bit;
}
};

AC代码

AC

https://qoj.ac/submission/1787588

AC

https://qoj.ac/submission/2095935

心路历程(WA,TLE,MLE……)

image