当前位置: 首页 > news >正文

「SDOI2009」HH去散步

HH去散步

题目限制

  • 内存限制:125.00MB
  • 时间限制:1.00s
  • 标准输入
  • 标准输出

题目知识点

  • 动态规划 dpdpdp
  • 矩阵
    • 矩阵乘法
    • 矩阵加速
    • 矩阵快速幂
  • 思维
    • 构造

题目来源

「SDOI2009」HH去散步

题目

题目背景

HH 有个一成不变的习惯,喜欢在饭后散步,就是在一定的时间内,走一定的距离
同时, HH 是一个喜欢变化的人,她不会立刻沿着刚刚走过来的路走回去,她也希望每天走过的路径都不完全一样,她想知道每一天他究竟有多少种散步的方法

题目描述

现在 HH 送给你一张学校的地图,请你帮助她求出从地点 AAA 走到地点 BBB 一共有多少条长度为 TTT 的散步路径(答案对 459894598945989 取模)

格式

输入格式

输入共 M+1M + 1M+1 行:
111 行:输入 555 个整数 N,M,T,A,BN, \ M, \ T, \ A, \ BN, M, T, A, BNNN 表示 学校里的路口的个数(编号为 0∼N−10 \sim N - 10N1MMM 表示 学校里的道路的条数TTT 表示 HH 想要散步的距离AAA 表示 散步的出发点BBB 表示 散步的终点
接下来 MMM 行:每行 222 个用空格隔开的整数 ui,viu_i, \ v_iui, vi;表示 长度为 111 的第 iii 条路 连接 路口 uiu_iui路口 viv_ivi

输出格式

输出共一行:表示你所求出的答案(对 459894598945989 取模)

样例

样例输入

4 5 3 0 0
0 1
0 2
0 3
2 1
3 2

样例输出

4

提示

数据范围

对于 30%30 \%30% 的数据:满足 N≤4,M≤10,T≤10N \leq 4, \ M \leq 10, \ T \leq 10N4, M10, T10
对于 100%100 \%100% 的数据:满足 N≤50,M≤60,T≤230,ui≠viN \leq 50, \ M \leq 60, \ T \leq 2 ^ {30}, \ u_i \neq v_iN50, M60, T230, ui=vi


思路

这道题如果没有 她不会立刻沿着刚刚走过来的路走回去 的限制,就可以根据点与点的关系先构造出一个 n∗nn * nnn 的矩阵 x\mathrm{x}xx[i][j]\mathrm{x}[i][j]x[i][j] 表示从 iii111 步到 jjj 的方案数),累乘 TTT 次(就是走了 TTT 步),就用矩阵快速幂优化既可以通过了
现在就考虑加上这句话的限制后如何构造矩阵了


分析

考虑矩阵定义大致不变,即 x[i][j]\mathrm{x}[i][j]x[i][j] 表示从 iii111 步到 jjj 的方案数
由于有限制,就要记录刚刚走过来的路是哪一条
不妨把每条边对应的 uiu_iuiviv_ivi 拆成两个二元组 (node,id)\mathrm{(node, id)}(node,id),表示刚刚从第 id\mathrm{id}id 条路走到 node\mathrm{node}node,也就是每条无向边 (ui↔,vi)(u_i \leftrightarrow, v_i)(ui,vi) 分成两条有向边 (ui→vi)(u_i \to v_i)(uivi)(vi→ui)(v_i \to u_i)(viui),其中 node\mathrm{node}node 表示当前这条有向边的终点,id\mathrm{id}id 表示与之对应的无向边的编号
那么 x[i][j]=1\mathrm{x}[i][j] = 1x[i][j]=1 定义就是 iii 个二元组111 步到 jjj 个二元组 的方案数
其值只可能为 000111(因为只走了 111 步),其中值为 111 的条件就是 idi≠idj\mathrm{id}_i \neq \mathrm{id}_jidi=idjnodei\mathrm{node}_inodeinodej\mathrm{node}_jnodej 有一条边
推出了矩阵,但是还有一个细节,就是第一步的方案数
起始点是没有上一条边的,所以需要预处理一下(这里相当于先走了一次)
预处理矩阵 ×\times× 矩阵快速幂(T−1T - 1T1 次,预处理走了一次)就可以得到最终的矩阵了
最后把 起始点(超级源点)终点(可能有多个,因为分了边) 的路径加起来取模就可以了


代码

#include <cstdio>
#include <cstring>int rint()
{int x = 0, fx = 1; char c = getchar();while (c < '0' || c > '9') { fx ^= ((c == '-') ? 1 : 0); c = getchar(); }while ('0' <= c && c <= '9') { x = (x << 3) + (x << 1) + (c ^ 48); c = getchar(); }if (!fx) return -x;return x;
}const int MOD = 45989;const int MAX_N = 20;
const int MAX_M = 60;int N, M, T, A, B, node;
int e[MAX_M * 2 + 5][3];struct Matrix
{int mx[MAX_M * 2 + 5][MAX_M * 2 + 5];Matrix () { memset(mx, 0, sizeof(mx)); }void init() { for (int i = 0; i <= node; i++) mx[i][i] = 1; }Matrix operator * (const Matrix &rhs) const{Matrix res;for (int i = 0; i <= node; i++)for (int j = 0; j <= node; j++)for (int k = 0; k <= node; k++)res.mx[i][j] = (res.mx[i][j] + mx[i][k] * rhs.mx[k][j]) % MOD;return res;}
} dp, quick;Matrix qpow(Matrix mx, int k)
{Matrix res; res.init();while (k > 0){if (k & 1) res = res * mx;mx = mx * mx; k >>= 1;}return res;
}int main()
{N = rint(), M = rint(), T = rint();A = rint() + 1, B = rint() + 1;for (int i = 1; i <= M; i++){e[i][0] = rint() + 1, e[i][1] = rint() + 1;e[i + M][0] = e[i][1], e[i + M][1] = e[i][0];if (e[i][0] == A) ++dp.mx[0][i];if (e[i + M][0] == A) ++dp.mx[0][i + M];}node = M << 1;for (int i = 1; i <= node; i++)for (int j = 1; j <= node; j++)if (i + M != j && i - M != j && e[i][1] == e[j][0]) ++quick.mx[i][j];int ans = 0;Matrix res = dp * qpow(quick, T - 1);for (int i = 1; i <= node; i++)if (e[i][1] == B) ans = (ans + res.mx[0][i]) % MOD;printf("%d\n", ans);return 0;
}

相关文章:

「SDOI2009」HH去散步

HH去散步 题目限制 内存限制&#xff1a;125.00MB时间限制&#xff1a;1.00s标准输入标准输出 题目知识点 动态规划 dpdpdp矩阵 矩阵乘法矩阵加速矩阵快速幂 思维 构造 题目来源 「SDOI2009」HH去散步 题目 题目背景 HH 有个一成不变的习惯&#xff0c;喜欢在饭后散步…...

用上Visual Studio后,我的世界游戏的构建时间减少了一半

今天我们讲述一个使用 Visual Studio 提升工作效率的案例。 我的世界(Minecraft) 游戏开发商 Mojang Studios 近日联系了 Visual Studio C 团队&#xff0c;因为他们需要将 C 开发扩展到新平台&#xff08;Linux&#xff09;&#xff0c;同时还希望保留他们现有的技术基础&…...

34、基于51单片机锂电池电压电流容量检测仪表LCD液晶显示 原理图PCB程序设计

方案选择 单片机的选择 方案一&#xff1a;AT89C52是美国ATMEL公司生产的低电压&#xff0c;高性能CMOS型8位单片机&#xff0c;器件采用ATMEL公司的高密度、非易失性存储技术生产&#xff0c;兼容标准MCS-51指令系统&#xff0c;片内置通用8位中央处理器(CPU)和Flash存储单元…...

【Java基础】泛型(一)-基础使用

本文以Java的官方文档为参考&#xff0c;辅以代码示例&#xff0c;尽可能详尽的叙述泛型的每一个特性 什么是泛型 泛型&#xff08;Generics&#xff09;也称为参数化类型&#xff08;parameterized types&#xff09;&#xff0c;也就是将类型本身作为接口、类、方法中的参数…...

学Python不会不知道NumPy计算包吧,带你五分钟看懂NumPy计算包

从今天我们就开始进入 Python 数据分析工具的教程。 前段时间数据分析和Python都讲了一点点&#xff0c;但是Python的数据库&#xff0c;讲的少了点&#xff0c;所以接下来就讲讲这些重要的常用数据库吧&#xff01;&#xff01;&#xff01; Python 数据分析绝对绕不过的四个…...

积水内涝监测——埋入式积水终端设备介绍

一、设备概述 埋入式积水终端是针对城市内涝推出的积水信息监测采集设备&#xff0c;采用超声波传感技术&#xff0c;对积水的深度进行精确的测量。产品能够在低温、腐蚀环境下可靠运行本产品特别适用于智慧城市中&#xff0c;对城市道路、社区低洼处的积水进行实时监测上报到…...

Kafka的日志同步

首先介绍下LEO和HW LEO&#xff1a; 即LogEndOffset&#xff0c;表示该副本下次日志记录的偏移量HW&#xff1a;即HighWatermark&#xff0c;高水位线&#xff0c;是所有ISR副本集合中的LEO最小值上图中&#xff0c;如果此时三个副本都在ISR集合中&#xff0c;那么此时他们的LE…...

【Mybatis源码解析】mapper实例化及执行流程源码分析

文章目录简介环境搭建源码解析基础环境&#xff1a;JDK17、SpringBoot3.0、mysql5.7 储备知识&#xff1a;《【Spring6源码・AOP】AOP源码解析》、《JDBC详细全解》 简介 基于SpringBoot的Mybatis源码解析&#xff1a; 1.如何对mapper实例化bean 在加载BeanDefinition时&a…...

分布式文件管理系统(MinIO)

1.去中心化&#xff0c;每个点是对等的关系&#xff0c;通过Ngix对负载做均衡工作。 好处&#xff1a; 能够避免单点故障&#xff0c;将多块硬盘组成一个对象存储服务。 2. 使用纠删编码技术来保护数据&#xff0c;是一种回复丢失和损坏的数据的数学算法&#xff0c;他将数据分…...

Springcloud-配置中心config

一、添加依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId&…...

[项目篇] 音乐播放器开发报告

文章目录1. 项目描述:2. 项目上线展现&#xff1a;3. 项目具体实现&#xff1a;1. 登录2. 注册3.退出系统4.添加音乐4.1前后端交互约定4.2上传文件业务逻辑&#xff1a;4.3创建model包中的music类4.4在MusicMapper接口中&#xff0c;声明insertMusic抽象方法4.5在mybatis包中添…...

Spring Cloud Alibaba--gateway微服务详解之网关(二)

1、网关介绍 上篇对微服务中的nacos注册中心进行集成讲解。nacos主要作用是管理多服务之间复杂关系的组件。微服务是非常庞大且问题突出的架构&#xff0c;HTTP协议具有跨源资源共享 (CORS) Cross- Origin Resource Sharing机制&#xff0c;而处于安全考虑往往前端架构都会对跨…...

Zynq非VDMA方案实现视频3帧缓存输出,无需SDK配置,提供工程源码和技术支持

目录1、前言2、VDMA的不便之处3、FDMA取代VDMA实现视频缓存输出4、Vivado工程详解5、上板调试验证并演示6、福利&#xff1a;工程代码的获取1、前言 对于Zynq和Microblaze的用户而言&#xff0c;要想实现图像缓存输出&#xff0c;多半要使用Xilinx推荐的VDMA方案&#xff0c;该…...

血液透析过滤芯气密性检测装置中的高精度多段压力控制解决方案

摘要&#xff1a;针对目前血液过滤芯气密性检测过程中存在的自动化水平较低、多个检测压力之间需人工切换和压力控制精度较差的问题&#xff0c;为满足客户对高精度和自动化气密性检测的要求&#xff0c;本文提出了相应的解决方案。解决方案的主要特点是全过程的可编程压力控制…...

PDF加密如何批量解除?快来了解下这个方法

在现代办公环境中&#xff0c;PDF文档的使用非常普遍。然而&#xff0c;由于一些安全需求&#xff0c;有时候PDF文档会被加密&#xff0c;使得只有授权人员可以查看或修改它。但是&#xff0c;如果您需要对许多加密PDF文档进行操作&#xff0c;逐个解密这些文档可能非常费时费力…...

C++——哈希4|布隆过滤器

目录 布隆过滤器 完整代码 布隆过滤器应用 布隆过滤器的查找 布隆过滤器删除 布隆过滤器优点 布隆过滤器缺陷 布隆过滤器海量数据处理 布隆过滤器 位图只能映射整形&#xff0c;而对于字符串却无能为力。 把字符串用哈希算法转成整形&#xff0c;映射一个位置进行标…...

python冒号的用法总结

一维数组 1. 单个冒号的情况 1.1 写完整的情况下 单个冒号的情况下&#xff0c;对数组的遍历操作是从前向后操作。如&#xff1a;arr[a:b] &#xff0c;冒号前的a含义是从a开始遍历&#xff0c;冒号后的b含义是到b截止&#xff08;不包括b&#xff09;。 arr [1, 2, 3, 4,…...

面试题整理

面试题整理 一、Java基础 1、Java 语言有哪些特点 简单易学&#xff1b; 面向对象&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;&#xff1b; 平台无关性&#xff08; Java 虚拟机实现平台无关性&#xff09;&#xff1b; 支持多线程&#xff08; C 语言…...

C语言深度解剖-关键字(7)

目录 switch case 语句 理解&#xff1a; 补充&#xff1a; 深入理解&#xff1a; default 语句&#xff1a; case语句&#xff1a; 总结&#xff1a; do、while、for 关键字 while for do while 各种死循环方法&#xff1a; while for do while getchar 写在…...

利用JavaScript编写Python内置函数查询工具

最近我开始学习Python编程语言&#xff0c;我发现Python拥有非常丰富的内置函数&#xff0c;可以用来实现各种不同的功能。但是每当我需要查找一个内置函数时&#xff0c;我总是需要联网使用搜索引擎进行查询。这种方式不仅费时费力&#xff0c;而且需要联网&#xff0c;很不方…...

禅修运维法:服务器宕机时集体冥想

当技术危机遇上心灵平静在软件测试领域&#xff0c;服务器宕机是高频挑战&#xff0c;不仅中断测试流程&#xff0c;还引发团队压力。传统运维强调硬件修复和代码调试&#xff0c;但忽略了人的因素——压力下的决策失误往往加剧问题。禅修运维法创新性地将佛教禅修融入IT管理&a…...

三步突破抖音音乐批量下载难题:douyin-downloader全功能技术指南

三步突破抖音音乐批量下载难题&#xff1a;douyin-downloader全功能技术指南 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容创作领域&#xff0c;背景音乐是提升作品感染力的关键元素。然而&…...

OpenClaw定时任务管理:ollama-QwQ-32B实现智能提醒系统

OpenClaw定时任务管理&#xff1a;ollama-QwQ-32B实现智能提醒系统 1. 为什么需要智能提醒系统 作为一个长期被各种截止日期折磨的技术从业者&#xff0c;我一直在寻找一个能够真正理解我需求的提醒工具。传统的日历应用虽然能设置固定时间的提醒&#xff0c;但缺乏灵活性——…...

水墨江南模型Agent智能体开发:自主中式艺术创作助手

水墨江南模型Agent智能体开发&#xff1a;自主中式艺术创作助手 最近在捣鼓AI绘画&#xff0c;发现一个挺有意思的事儿。很多朋友想用AI画点有中国风味的作品&#xff0c;比如水墨画、山水画&#xff0c;但往往折腾半天&#xff0c;出来的效果总差那么点意思。要么是意境不对&…...

Qwen3.5小尺寸模型开源,9B碾压GPT开源版,消费级显卡就能跑

AI圈又出大新闻了✨ 阿里通义千问3.5系列小尺寸模型正式亮相&#xff0c;直接打破“小模型能力弱”的固有认知&#xff0c;甚至实现了“以小胜大”的逆袭&#xff0c;本地部署门槛直接拉到平民级&#xff01; 先上核心干货——这次千问3.5一口气推出了4款小尺寸模型&#xff0c…...

Android NDK开发从入门到实战:解锁应用性能的终极武器

引言 在Android应用开发领域&#xff0c;Java和Kotlin凭借其简洁的语法和强大的框架支持&#xff0c;成为了绝大多数开发者的首选。然而&#xff0c;当面对高性能计算、游戏引擎集成、硬件加速访问或核心算法保护等场景时&#xff0c;纯Java层的实现往往显得力不从心。这时&…...

包装器简介

可调用对象&#xff1a;可以使用&#xff08;&#xff09;运算符进行调用的对象&#xff0c;本质是能像函数一样使用的东西常见课调用对象&#xff1a;函数指针&#xff0c;仿函数&#xff0c;lambda表达式我们能否使用统一的方式对其封装&#xff0c;进行调用&#xff0c;这时…...

OpenClaw跨平台脚本:nanobot统一管理mac与Windows文件

OpenClaw跨平台脚本&#xff1a;nanobot统一管理mac与Windows文件 1. 为什么需要跨平台文件管理 在日常工作中&#xff0c;我经常需要在macOS和Windows双系统间切换。最让我头疼的就是文件路径的兼容性问题——macOS使用正斜杠/而Windows使用反斜杠\。每次写脚本都要为不同平…...

深入理解Matplotlib中的plt、fig、axes与axis:从基础到高级应用

1. Matplotlib绘图基础&#xff1a;从plt到figure的认知跃迁 第一次接触Matplotlib时&#xff0c;最让人困惑的就是plt.plot()和ax.plot()到底有什么区别。这就像学做菜时&#xff0c;有人告诉你"用锅炒菜"和"先用电磁炉加热再放锅炒菜"两种方式都能做出青…...

OpenClaw怎么部署?2026年3月OpenClaw(Clawdbot)在阿里云一键部署超全教程

OpenClaw怎么部署&#xff1f;2026年3月OpenClaw&#xff08;Clawdbot&#xff09;在阿里云一键部署超全教程。本文面向零基础用户&#xff0c;完整说明在轻量服务器与本地Windows11、macOS、Linux系统中部署OpenClaw&#xff08;Clawdbot&#xff09;的流程&#xff0c;包含环…...