QOJ.ac

QOJ

時間限制: 1.3 s 記憶體限制: 64 MB 總分: 100

#953. 棋盘冲刺

统计

国际象棋之地的神话世界是一个拥有 $R$ 行 $C$ 列的矩形网格,其中 $R \ge C$。其行和列分别从 $1$ 到 $R$ 和 $1$ 到 $C$ 进行编号。

国际象棋之地的居民通常被称为“棋子”,这片土地上有 5 种特定的棋子:兵(pawn)、车(rook)、象(bishop)、后(queen)和王(king)。与大众的认知相反,国际象棋之地早已没有了骑士精神,因此这里没有马(knight)。

每种棋子在从一个方格移动到另一个方格的方式上都是独特的:在一步之内,

  • 兵可以向前移动一行(即从第 $r$ 行移动到 $r+1$ 行),且不能改变列;
  • 车可以在不改变行的情况下向左/向右移动任意数量的列,或者在不改变列的情况下向前/向后移动任意数量的行;
  • 象可以移动到与其当前所在方格相交的两条对角线上的任意方格;
  • 后可以移动到车或象在当前位置可以移动到的任意方格;
  • 王可以移动到周围 8 个相邻方格中的任意一个。

在下图中,我们用 X 标记了每种棋子在一步之内可以移动到的方格(此处行从下到上编号,列从左到右编号)。

最近,国际象棋之地变得危险起来:穿过这片土地的棋子可能会意外地被未知力量捕获并直接消失。因此,它们希望以尽可能快的速度(即尽可能少的步数)到达目的地,并且它们也对以最少步数到达目的地的不同路径数量感兴趣。如果两条路径在至少一个经过的方格上不同,则认为它们是不同的。

对于本题,假设棋子从第 $1$ 行的某一列进入国际象棋之地,并从第 $R$ 行的某一列离开。你需要回答 $Q$ 个问题:给定棋子的类型、进入第 $1$ 行的列以及必须到达第 $R$ 行的列,计算该棋子在国际象棋之地所需的最少移动步数,以及以该步数到达目的地的不同路径数量。

输入格式

第一行包含三个空格分隔的整数 $R$、$C$ 和 $Q$,分别表示国际象棋之地的行数、列数以及询问次数。随后有 $Q$ 行。

每一行包含:

  • 一个字符 $T$,对应所询问的棋子类型('P' 代表兵,'R' 代表车,'B' 代表象,'Q' 代表后,'K' 代表王);
  • 两个整数 $c_1$ 和 $c_R$($1 \le c_1, c_R \le C$),表示棋子从第 $1$ 行的第 $c_1$ 列出发,必须到达第 $R$ 行的第 $c_R$ 列。

输出格式

你需要打印 $Q$ 行,第 $i$ 行包含两个空格分隔的整数,即第 $i$ 个问题的答案:第一个整数是所需的最少步数,第二个整数是使用该步数可用的不同路径数量。由于答案可能非常大,你需要使用评分系统提供的库函数计算其对 $10^9 + 7$ 取模的结果。

如果无法到达目标方格,输出一行 "0 0"。

实现细节

评分系统提供了以下库函数,用于执行涉及模 $10^9 + 7$ 的基本算术运算。在所有情况下,输入可以是任何有效的 int 值,输出范围为 $0, 1, 2, \dots, 10^9 + 6$。

  • int Add(int a, int b):计算 $a$ 与 $b$ 的和,并返回模 $10^9 + 7$ 的结果。
  • int Sub(int a, int b):计算 $a$ 减去 $b$ 的差,并返回模 $10^9 + 7$ 的结果。
  • int Mul(int a, int b):计算 $a$ 与 $b$ 的积,并返回模 $10^9 + 7$ 的结果。
  • int Div(int a, int b):计算 $a$ 除以 $b$($b \neq 0$)的商,并返回模 $10^9 + 7$ 的结果。即当且仅当 Mul(b, q) == a mod (10^9 + 7) 时,返回 $0 \le q < 10^9 + 7$ 的值。

你可以假设上述所有操作都在常数时间内完成。

要访问这些函数,你必须在你的解决方案的包含列表中添加 #include "arithmetics.h"

注意:arithmetics.h 头文件不可用。

样例

输入 1

8 8 5
P 1 2
R 4 8
Q 2 3
B 3 6
K 5 5

输出 1

0 0
2 2
2 5
2 2
7 393

数据范围

$1 \le Q \le 1000$ $2 \le C \le 1000$ $C \le R \le 10^9$

子任务

子任务 分值 约束
1 0 样例
2 8 $T \in \{'P', 'R', 'Q'\}$,即所有棋子均为兵、车或后
3 15 $T = 'B'$ 且 $C, R \le 100$
4 22 $T = 'B'$
5 5 $T = 'K'$ 且 $C, R \le 100$ 且 $Q \le 50$
6 8 $T = 'K'$ 且 $C, R \le 100$
7 15 $T = 'K'$ 且 $C \le 100$
8 20 $T = 'K'$
9 7 无额外约束

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.