1 条题解
-
0
自动搬运
来自洛谷,原作者为

WZWZWZWY
一只蜷缩在只因房里敲代码的蒟蒻(真)|| ╯ω╰ || 这只蒟蒻已经被滚去学whk了qwq搬运于
2025-08-24 23:00:32,当前版本为作者最后更新于2024-07-08 08:08:39,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
啊吧啊吧,被打回了。原因是“大数字应使用科学计数法表示”,于是我改成了 。(
话说 不是科学计数法吗?)

从下往上看↑(真实事件未改编)
题意避坑
这道题坑也是非常的多。
一:
目标是在恰好两步内获得尽可能多的星星,然而小 S 不会玩,于是每次就会随意挑选一个可以移动到的新位置进行移动。前一句话我给她划掉了,因为这是误导句。后面一句才是重点,千万不要用正常人玩游戏的思维!
小 S 随意移动。
- 不需要找尽可能多的星星。
二:
每次操作,你可以将捕捉器移动到同行或同列的某个位置,使得新位置与原位置不同且必须保证新位置 满足 ,。捕捉器会捕捉 到 路径上所有的星星。一个星星被捕捉后将会消失。
- 也就是说,你每次可以上下左右移动任意格,就像象棋里的车。但是每次必须移动,移动两次。这路上经过的所有星星都会被吃掉。
比如可以这么移动:
这就算两步。是一个方向也可以。(因为小 S 不会玩啊,随意移动)
那么小 S 还可以有什么操作呢?
初始点 ,有星星的点 。
都可以。
还有,注意到新位置 满足 ,。也就是说:
- 地图的最小坐标是 ,而不是 。
三:
是初始点, 是有星星的点。也就是说:
- 初始点上不会有星星。
四:
每个位置上可以有多颗星星。
就在“输入格式”里,原话……
目前只记得这些,还有什么容易踩到的坑,欢迎在评论区交流!
样例解释
很多人第一个样例都只找到了共 颗星星的路径。

(左边是路径,右边是可以得到的星星数,忽略没有星星的路径。这里少了一条。)
剩下一条,看了上面“避坑”,你应该能找到。
得到 颗星星。所有路径总共 颗。
思路
对于每一颗星星,计算初始点到它的路径数量 。最后累加 计入答案。
推导式子

用电脑绘图累死我了,还不快点个赞!当在同一行或同一列时,拿 举例:
首先,第一步只能向左走,对吧?否则两步到不了 。
若从 第一步走到 ,可以上下左右移动任意步(但步数 ,,),所以总共有 种结果。
也可以第一步向左超过 ,这时第二步也是上下左右任意移动, 种结果。
若第一步没有走到 ,或者先向右走,那么第二步必须走到 ,或者超过 ,才能吃到它,总共有 种结果。
那么加起来就有 种结果。
其它三个方向(上、右、下)同理。

不在同一行或同一列。
拿这个图举例。
显然,有两种路径到达 ,分别是 和 。
这个时候已经用了“两步”了,不可能再转向。但是——这个时候最后一步可能没有走完,可以继续往前走。
可以 。
那么显然地,最后一步向下的方案数为 ,向左的方案数为 。
总的方案数是 。
其他方向同理。
代码
忠告: 不要取错。每次乘法都要取模。,不开
long long见祖宗。(考场代码,保险起见都加上了取模。可能稍微合并了一些公式。)
cin >> p >> q; // 每个星星的横、纵坐标 int cnt = 0; if (p < x) { // 横坐标比初始点横坐标小 if (q < y) cnt = p % mod + q % mod; // 纵坐标比初始点小 if (q > y) cnt = (m-q+1) % mod + p % mod; // 纵坐标比初始点大 if (q == y) cnt = (n+m-2 + n-p-1) % mod * (p % mod) % mod; // 纵坐标相等 } else if (p > x) { if (q < y) cnt = q % mod + (n-p+1) % mod; if (q > y) cnt = (m-q+1) % mod + (n-p+1) % mod; if (q == y) cnt = (n-p+1) % mod * ((n+m-2 + p-2) % mod); } else { // 横坐标相等 if (q > y) cnt = (m-q+1) % mod * (((n+m-2) % mod + q-2) % mod); else cnt = q % mod * ((m+n-2 + m-q-1) % mod); } ans += cnt;还有什么不懂的或者想吐槽的可以在评论区讨论。
- 1
信息
- ID
- 9958
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者