专栏文章

题解:P13577 [CCPC 2024 重庆站] 骰子

P13577题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mioigvte
此快照首次捕获于
2025/12/02 19:45
3 个月前
此快照最后确认于
2025/12/02 19:45
3 个月前
查看原文
事实上,如果做这道题的时候手边能有个骰子就会简单很多(我就有好几个骰子,嘻嘻)。

思路

这道题要求一种感觉。
幸运的是,我很快就找到了这种“感觉”:n,m2n,m\geq2 时,所有 n×mn\times m 个格子都可以在任意次操作后变成 66

证明

在这个证明中,我们无需考虑其他数字在骰子上的位置,只需要考虑 66 在哪个面即可。
我们可以将网格的右上角(骰子的初始位置)的坐标设为 (1,1)(1,1)xx 轴向右、yy 轴向下建立坐标系。
初始,骰子在 (1,1)(1,1) 位置,66 在下面。
接下来开始我们的操作。
  1. 骰子在 (1,1)(1,1) 位置;
  2. 骰子向前转到 (2,1)(2,1) 位置(第 22 行第 11 列),66 被转到后面;
  3. 骰子向右转到 (2,2)(2,2) 位置,66 还在后面;
  4. 骰子向后转到 (1,2)(1,2) 位置,66 被转到下面;
  5. (1,2)(1,2) 位置写下 66
让我们来表示这个操作。
  1. 骰子在 (i,j)(i,j) 位置(这个位置已经被写下 66;满足 1i<n, 1j<m1\leq i<n,\ 1\leq j<m)。
  2. (i,j)(i+1,j)(i,j)\rightarrow(i+1,j)
  3. (i+1,j)(i+1,j+1)(i+1,j)\rightarrow(i+1,j+1)
  4. (i+1,j+1)(i,j+1)(i+1,j+1)\rightarrow(i,j+1)
  5. (i,j+1)(i,j+1) 位置写下 66
至此,我们完成了骰子向右转 11 格并写下 66 的操作。
总结:借助下一行不断完成向右 11 格并写下 66 的操作,最后填满网格。
现在我们还要来考虑 i=ni=nj=mj=m特殊情况
  • i=ni=n 时,说明来到最后一行,无法借助下一行。此时可以借助上一行,即:(i,j)(i1,j)(i,j)\rightarrow(i-1,j) 并继续完成之后的操作。
  • j=mj=m 时,说明来到当前行的最后一格。接下来详细解释。
j=mj=m 时,我们可以按照如下操作将位于 (i,m)(i,m) 骰子转到下一行,并使 66 落到 (i+1,m)(i+1,m) 这个格子上。
  1. 骰子在 (i,m)(i,m) 位置(此时 66 在下面)。
  2. 骰子向左转到 (i,m1)(i,m-1) 位置,66 被转到右面;
  3. 骰子向前转到 (i+1,m1)(i+1,m-1) 位置,66 还在右面;
  4. 骰子向右转到 (i+1,m)(i+1,m) 位置,66 被转到下面;
  5. (i+1,m)(i+1,m) 位置写下 66
在第 i+1i+1 行中,我们不能再将骰子每次向右移(因为本来就在最右边),但可以改为向左移。具体操作方法和向右移相似,只是每次操作方向对称,不再赘述。

结论

由以上证明,最终可以得出结论:当 n,m2n,m\geq2 时,所有格子都可以经过若干次操作后被写上 66,直接输出 n * m * 6

代码

CPP
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n, m; cin >> n >> m;
    cout << n * m * 6;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...