CF2091F.Igor and Mountain

普及+/提高

通过率:0%

AC君温馨提醒

该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

IT Campus "NEIMARK" 的访客不仅是优秀的程序员,更是体魄强健的运动爱好者!有人练习游泳,有人划船,还有人进行攀岩!

Igor 大师是当地攀岩界的知名人物。某天,他前往山区攀登一座山峰。作为经验丰富的攀岩者,Igor 决定不沿既有路线,而是利用自己的技巧严格垂直攀登。

Igor 找到了一块垂直的矩形山体区域,并将其在脑海中划分为 nn 个水平层。随后他将每层用垂直隔板分割为 mm 个区段。观察这些区段时,Igor 发现了可供抓握的凸起(以下称为支点)。因此,所选山体区域可表示为 n×mn \times m 的矩形,其中某些单元格包含支点。

作为资深程序员,Igor 决定计算有效路线的数量。路线被定义为由不同支点组成的序列。当满足以下条件时,路线被视为有效:

  • 路线中第一个支点位于最底层(第 nn 行);
  • 路线中最后一个支点位于最顶层(第 11 行);
  • 每个后续支点不低于前一个支点;
  • 每层(即矩形的每一行)至少使用一个支点;
  • 每层最多使用两个支点(因 Igor 只有双手);
  • 当相邻支点对应区段中心点的欧氏距离不超过 Igor 的臂展时,才能从当前支点移动到下一个支点。

Igor 的臂展为 dd,这意味着当两个支点对应区段中心点的欧氏距离不超过 dd 时可进行移动。区段 (i1,j1)(i_1, j_1) 与 (i2,j2)(i_2, j_2) 之间的距离计算公式为 (i1−i2)2+(j1−j2)2\sqrt{(i_1 - i_2)^2 + (j_1 - j_2)^2}。

请计算不同有效路线的数量。若两条路线使用的支点列表或访问顺序不同,则视为不同的路线。

输入格式

每个测试包含多个测试用例。第一行包含测试用例数量 tt (1≤t≤1031 \leq t \leq 10^3)。接下来是测试用例描述。

每个测试用例的第一行包含三个整数 nn、mm、dd (2≤n≤20002 \leq n \leq 2000, 1≤m,d≤20001 \leq m, d \leq 2000)。

接下来的 nn 行每行包含 mm 个字符 —— 描述山体各层情况。字符 '#' 表示空区段,'X' 表示含支点的区段。层数描述顺序为从上到下。

保证所有测试用例的 n⋅mn \cdot m 之和不超过 4⋅1064 \cdot 10^6。

输出格式

对于每个测试用例,输出不同路线数量对 998244353998244353 取模后的结果。

输入输出样例

  • 输入#1

    3
    3 4 1
    XX#X
    #XX#
    #X#X
    3 4 2
    XX#X
    #XX#
    #X#X
    3 1 3
    X
    X
    #

    输出#1

    2
    60
    0

说明/提示

第一个样例中的可能路线:


第二个样例中 Igor 的臂展增大,因此新路线可用,例如:


第三个样例中底层没有支点,因此不存在有效路线。

翻译由 DeepSeek R1 完成

输入解题思路,AI测评打分。不知道怎么写?

首页