0%

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

题目 H. Prime Topology

https://codeforces.com/gym/106262/problem/H

题目描述
定义集合 Un={1,2,3,,n}U_n = \{1, 2, 3, \dots, n\}
如果 UnU_n 的一个子集 SS 满足:对于 SS 中任意两个不同的元素 aabb,它们的绝对差 ab|a - b| 都是素数,则称该子集 SS素数间距的(prime-spaced)
给定正整数 nnkk,求在 UnU_n 中,大小为 kk 的素数间距子集的数量。
由于答案可能很大,请输出其对 104206969 取模后的结果。
本题包含多组独立测试数据。

输入格式
第一行包含一个整数 TT1T2×1051 \le T \le 2 \times 10^5),表示测试数据的组数。
接下来 TT 行,每行包含两个由空格分隔的整数 nnkk1kn1071 \le k \le n \le 10^7)。

输出格式
对于每组测试数据,输出一行,表示大小为 kk 的素数间距子集的数量对 104206969 取模的值。

样例输入

1
2
3
4
3
5 2
6 3
10000000 10000000

样例输出

1
2
3
5
2
0

样例解释
对于第一组样例 n=5,k=2n=5, k=2
U5={1,2,3,4,5}U_5 = \{1, 2, 3, 4, 5\},要求找出大小为 2 且元素差值的绝对值为素数的子集。
差值为 2(素数)的子集有:{1,3},{2,4},{3,5}\{1, 3\}, \{2, 4\}, \{3, 5\}
差值为 3(素数)的子集有:{1,4},{2,5}\{1, 4\}, \{2, 5\}
总共有 5 个满足条件的子集,故输出 5。

对于第二组样例 n=6,k=3n=6, k=3
U6={1,2,3,4,5,6}U_6 = \{1, 2, 3, 4, 5, 6\},要求找出大小为 3 且任意两个元素差值的绝对值均为素数的子集。
满足条件的子集仅有以下 2 个:

  1. {1,3,6}\{1, 3, 6\}:任意两元素差值分别为 13=2|1-3|=236=3|3-6|=316=5|1-6|=5,均为素数。

  2. {1,4,6}\{1, 4, 6\}:任意两元素差值分别为 14=3|1-4|=346=2|4-6|=216=5|1-6|=5,均为素数。
    总共有 2 个满足条件的子集,故输出 2。

对于第三组样例 n=10000000,k=10000000n=10000000, k=10000000
要求选出大小等于全集的子集,即只能选择集合本身。显然该集合中包含了差值为 1 的元素对(如 1 和 2,且 1 不是素数),因此不存在满足条件的子集,故输出 0。

首先要注意到,除了 2 以外所有的素数都是奇数,奇数+奇数就是偶数一定是可以被除的。所以说只能是 2+另一素数+2。

注意,这道题目的这个询问量特别高,因此要把东西都处理出来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
if (K==1) {
cout<<N<<"\n";
return;
}
ll ans=0;
// 除了 2 以外所有的素数都是奇数,奇数+奇数就是偶数一定是可以被除的
if (K==2) {
ans=N*cnt_prime[N]-pre_sum[N];
ans%=mod;
if (ans<0) {
ans+=mod;
}
cout<<ans<<"\n";
return;
}
if (K==3) {
ans=N*cnt_prime_add2[N-2]*2-pre_sum_add2[N-2];
ans%=mod;
if (ans<0) {
ans+=mod;
}
cout<<ans<<"\n";
return;
}
if (K==4) {
// 只有一个数,就是 3。
for (auto p:p_add4_is_p) {
ll len=p+2+2;
if (len>=N) {
break;
}
// if (minp[p+2+2]==p+2+2 && minp[p+2]==p+2) {
ans+=(N-len);
ans%=mod;
// }
}
cout<<ans<<"\n";
return;
}
if (K>=5) {
cout<<0<<"\n";
return;
}

AC
https://codeforces.com/gym/106262/submission/365350177

题目 E. Long Distance Examination(远程操作克隆机器人,两人在不同迷宫中,B 尽力复刻 A 的所有操作)

https://codeforces.com/gym/106262/problem/E

题目描述
Hero A 在网格 A 中,他正在远程控制位于网格 B 中的克隆人 Clone B 走迷宫
两个网格的大小均为 r×cr \times c。网格中包含空地(.)、障碍物(X)、起点(S)和终点(D)。起点 S 在两个网格中各出现一次,分别表示 Hero A 和 Clone B 的初始位置;终点 D 只在网格 B 中出现一次,表示 Clone B 需要到达的目的地。

Hero A 可以向上下左右四个方向移动,每次一步。他每尝试向某个方向移动一步,Clone B 也会尝试向相同的方向移动一步。移动规则如下

  1. 如果 Hero A 的移动方向被障碍物或网格边界阻挡,那么 Hero A 无法移动,此时 Hero A 和 Clone B 都不会移动

  2. 如果 Hero A 可以移动,但 Clone B 的移动方向被障碍物或边界阻挡,则 Hero A 会正常移动一步,而 Clone B 会停留在原地

  3. 如果两者前方均无阻挡,则两人都正常向该方向移动一步。

求使得 Clone B 到达终点 D,Hero A 最少需要移动的步数。如果无法到达,输出 -1

输入格式
第一行包含一个整数 TT1T101 \le T \le 10),表示测试数据的组数。
对于每组测试数据:
第一行包含两个由空格分隔的正整数 rrcc1r,c100,2r×c10001 \le r, c \le 100, 2 \le r \times c \le 1000)。
接下来 rr 行,每行包含一个长度为 cc 的字符串,表示网格 A 的状态。
再接下来 rr 行,每行包含一个长度为 cc 的字符串,表示网格 B 的状态。
字符仅包含 .XSD

输出格式
对于每组测试数据,输出一行,包含一个整数,表示最少需要的步数。如果不可达,则输出 -1

样例输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
5 5
S....
.....
.....
.....
.....
....S
.....
.....
.....
....D
7 5
XXXXX
XXXXX
XS..X
X.X.X
X...X
XXXXX
XXXXX
XXXXX
XS..X
XXX.X
X...X
XXX.X
XD..X
XXXXX

样例输出

1
2
4
14

样例解释
对于第一组样例:
网格 A 的起点在左上角,网格 B 的起点在右上角,终点在右下角。尽管 Hero A 和 Clone B 的起点不同,由于两个网格中间都没有障碍物,Hero A 只需要一直向下走 4 步,Clone B 也会无阻挡地同时向下走 4 步到达终点。最少步数为 4。

对于第二组样例:
Hero A 位于网格 A 的 (3, 2),而 Clone B 位于网格 B 的 (2, 2)。由于网格 B 中有较多障碍物阻挡了直接向下走向终点的路径,Hero A 可以利用“自己移动而 Clone B 被墙挡住留在原地”的机制来调整两者之间的相对位置。
最优解是 Hero A 在网格 A 中顺时针绕行:

  • Hero A 走一圈(右右下下左左上上,共 8 步)回到原点,此时 Clone B 会在跟随移动的过程中被障碍物卡住,最终停留在网格 B 的 (4, 2) 位置。

  • 随后 Hero A 继续走第二圈(右右下下左左,走 6 步时),Clone B 会顺势移动到 (6, 2) 的终点 D
    总共花费 8+6=148 + 6 = 14 步,使得 Clone B 到达终到达终点。

比较像这道题目 2025 CCPC 郑州的这道题目。

https://qoj.ac/contest/2661/problem/15307

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

这道题目比这个 G 简单,比较容易发现:

1
2
3
4
5
6
7
8
9
struct XY_AB{
ll xa,ya,xb,yb;
bool operator<(const XY_AB &o) const {
if (xa!=o.xa) return xa<o.xa;
if (ya!=o.ya) return ya<o.ya;
if (xb!=o.xb) return xb<o.xb;
return yb<o.yb;
}
};

一个完整状态由 A 的位置和这个 B 的位置确定,我们只需要对这一状态进行记忆化 bfs 即可。

AC
https://codeforces.com/gym/106262/submission/365338227

题目3

题目4

题目5