首页 > 其他分享 >【总结】2023-03-03 Rook Path

【总结】2023-03-03 Rook Path

时间:2023-03-03 22:34:36浏览次数:55  
标签:03 Rook 格子 ne 同列 行且 起点 Path leqslant

Rook Path

题意

有一个 \(n\) 行 \(m\) 列的矩阵,有一只乌鸦在 \((x_1,y_1)\) 上,它想要去 \((x_2,y_2)\)。

乌鸦可以飞 \(k\) 次:

  • 假设乌鸦现在在 \((x,y)\),它可以选择以下两种情况中的任意一种执行。
    1. 飞到 \((x,y')\) 并且 \((y' \ne y)\)
    2. 飞到 \((x',y)\) 并且 \((x' \ne x)\)

问有多少种方法,使得 \(k\) 次操作后乌鸦能落到 \((x_2,y_2)\)。

方案数要对 \(998244353\) 取模。

对于 \(i\ (1 \leqslant i < k)\),\(i\) 次操作后是可以在 \((x_2,y_2)\)

数据范围

  • \(1 \leqslant n,m \leqslant 10 ^ 9\)
  • \(1 \leqslant k \leqslant 10 ^ 6\)
  • \(1 \leqslant x_1,x_2 \leqslant n\)
  • \(1 \leqslant y_1,xy_2 \leqslant m\)

思路

爆搜是不可能AC的。

但是,通过暴力输出dp数组,我们可以发现:不是每种情况都是需要算的,某些情况是重复的!

结果可以分为四类,如下图,每种颜色代表一种答案。

  • 设起点为 \((x_1,y_1)\)
    1. \((x_1,y_1)\)
    2. \((x_1,y) (y \ne y_1)\)
    3. \((x,y_1) (x \ne x_1)\)
    4. \((x,y) (x \ne x_1,y \ne y_1)\)

继续画图来找规律

下面的同行同列指的是与起点同行或同列。

1|\((x_1,y_1)\)

同行同列的格子可以转移到这个格子上

  • 同行格子数(减去起点):\(m - 1\)
  • 同列格子数(减去起点):\(n - 1\)

2|\((x_1,y) (y \ne y_1)\)

同行的格子、起点以及不同行且不同列的格子可以转移到这个格子上

  • 同行格子数(减去起点和自己):\(m - 2\)
  • 起点:\(1\)
  • 不同行且不同列的格子:\(n - 1\)

3|\((x,y_1) (x \ne x_1)\)

同列的格子、起点以及不同行且不同列的格子可以转移到这个格子上

  • 同列格子数(减去起点和自己):\(n - 2\)
  • 起点:\(1\)
  • 不同行且不同列的格子:\(m - 1\)

4|\((x,y) (x \ne x_1,y \ne y_1)\)

同列的格子、同行的格子以及不同行且不同列的格子可以转移到这个格子上

  • 同列格子数:\(1\)
  • 同行格子数:\(1\)
  • 不同行且不同列的格子:\(n + m - 4\)

复杂度

  • 时间:\(O(k)\)
  • 空间:\(O(4 \times k)\)

Code

点击查看代码
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

const int mod = 998244353, K = 1e6 + 1;

int n, m, k, sx, sy, ex, ey;
long long dp[K][6], ans;

int main(){
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n >> m >> k >> sx >> sy >> ex >> ey;
  dp[0][0] = 1;
  for (int i = 1; i <= k; i++) {
    dp[i][0] = (dp[i - 1][1] * (m - 1) % mod + dp[i - 1][2] * (n - 1) % mod) % mod;
    dp[i][1] = (dp[i - 1][0] + dp[i - 1][1] * (m - 2) % mod + dp[i - 1][3] * (n - 1) % mod) % mod;
    dp[i][2] = (dp[i - 1][0] + dp[i - 1][3] * (m - 1) % mod + dp[i - 1][2] * (n - 2) % mod) % mod;
    dp[i][3] = (dp[i - 1][1] + dp[i - 1][2] + dp[i - 1][3] * (n + m - 4) % mod) % mod;
  }
  if (ex == sx && ey == sy) {
    ans = dp[k][0];
  } else if (ex == sx) {
    ans = dp[k][1];
  } else if (ey == sy) {
    ans = dp[k][2];
  } else {
    ans = dp[k][3];
  }
  cout << ans;
  return 0;
}

标签:03,Rook,格子,ne,同列,行且,起点,Path,leqslant
From: https://www.cnblogs.com/Luogu724052/p/17176896.html

相关文章

  • 链接mysql数据库报错:2003-cant connect to Mysql server on ‘localhost’(10038)
    今天用navicat连mysql时候突然报错了 我百度了一下,知道了是mysql服务没开,但是我打开了服务,发现服务里面没有mysql,于是就去cmd以管理员身份打开命令提示符,切换到......
  • 3月03日课后总结
    3/03课后总结配合匿名函数使用的方法1.map(函数名,要遍历的数据)#内部本质就是for循环,再记住两个参数的位置和作用2.zip(拉链)l=[1,2,3,4,5,6,7,8]l1......
  • day03(2023.3.2)
    今日份学习:1.字符char2.布尔型boolean 3.运算符算数运算符 4.赋值运算符和扩展赋值运算符 5.关系运算符 6.逻辑运算符 7.位运算 8.字符串 9.......
  • HTM'L
    <html><hend><title>美食</title></hend><body><h3align="center"><b>必吃美食</b></h3><tablealign="center"cellpandding="10px"style="bord......
  • 【总结】2023-03-01 Swap and Sort
    SwapandSort题意有一个\(1\dotsn\)的全排列\(p_1\dotsp_n\)。有\(m\)种操作,第\(i\)种操作可以交换\(p_{a_i}\)和\(p_{b_i}\)请问最多执行\(10^5\)次......
  • Column count doesn't match value count at row 1存储的数据与数据库表的字段类型定
    一、造成这个原因可能是一个关于创建json数据类型的mysql表格插入的一个报错提示:26行为错误示范;27是正确书写规范。 ......
  • ARM架构工控机BL103兼容SQLite3
    钡铼技术BL302,它是一款基于arm架构的工业边缘计算机,采用NXP的高性能处理器I.MX6ULL 运行速度高达800MHz,并配有8GFlash空间和512M RAM,硬件接口1个MINI PCI-E口支持4G或者W......
  • AttributeError: module 'openai' has no attribute 'ChatCompletion'的解决办法
    原因openai库版本过旧解决办法(二选一)pipinstall-Uopenai下载安装包放入你的项目根目录下,改名格式zip为whl(即:openai-0.27.0-py3-none-any.zip→openai-0.27.0-py3-......
  • 【总结】2023-03-01 Σ[k=0..10^100]floor(X/10^k)
    Σ[k=0..10^100]floor(X/10^k)题意给定一个整数\(x\),求\(\sum\limits_{k=0}^{10^{100}}\lfloor\frac{x}{10^k}\rfloor\)。数据范围\(1\leqslantx\leqslant......
  • 【总结】2023-03-01 Count Interval
    CountInterval题意给定\(n\)个数字\(a_1,a_2\ldotsa_n\)和一个整数\(k\),求有多少个非空子段之和为\(k\)。也就是问有多少对数\((l,r)(1\leqslantl\leqsla......