POJ 3734 Blocks 动态规划(矩阵的幂)

一、题目大意

我们要给排成一行的区块涂颜色,可以选择红、绿、蓝、黄四种,要求红和绿的块都必须是偶数个,求出最终的涂色方式,对10007取余。

二、解题思路

我们设三个数列A,B和C:

1、A代表红色和绿色都为偶数的组合数。

2、B代表红色为奇数,绿色为偶数的组合数。

3、C代表红色和绿色都为奇数的组合数。

题目给出A[1]=2,A[2]=6,接下来我们推理A[3]和A[N]

当第一块不是红和绿时,有 A[2] * 2种,

当第一块是红色时,剩下的需要让红色为奇数个且绿色为偶数个,那么剩下的直接按照B[2]的排列方式即可。

当第一块为绿色时,剩下的需要让绿色为奇数个且红色为偶数个,这种情况在数值上和B[2]相等。

则 A[3] = A[2] * 2 + B[2] * 2

同时不难看出,A[2] = A[1] * 2 + B[1] * 2

所以 A[3] = A[1] * (2 ^ 2) + B[1] * (2 ^ 2) + B[2] * 2,代入A[1]=2

A[3] = 2 ^ 3 + B[1] * (2 ^ 2) + B[2] * 2

推出A[N] = 2 ^ N + B[1] * (2 ^ (N - 1)) + B[2] * (2 ^ (N - 2)) + ... B[N-1] * (2 ^ 1) = A[N-1] * 2 + B[N-1] * 2

接下来再来推C数列,不难看出C[1] = 0,C[2] = 2,接下来推 C[3] 和 C[N]

当第一块不为红色和绿色时,排列数为 2 * C[2]。

当第一块为绿色时,剩余的块需要绿色为偶数,红色为奇数,即B[2]种。

当第二块为红色时,剩余的块需要红色为偶数且绿色为奇数,这种情况数值上等于B[2]

则C[3] = C[2] * 2 + B[2] * 2

同理C[4] = C[3] * 2 + B[3] * 2

不难看出 C[2] 也等于 C[1] * 2 + B[1] * 2

我们把C[1] = 0代入C[2]个式子

C[2] = B[1] * 2

把 C[2] 待入 C[3] 的式子

C[3] = B[1] * (2 ^ 2) + B[2] * 2

把 C[3] 带入 C4 的式子

C[4] = B[1] * (2 ^ 3) + B[2] * (2 ^ 2) + B[3] * 2

则C[N] = B[1] * (2 ^ (N - 1)) + B[2] * (2 ^ (N  - 2)) + ... B[N-1] * (2 ^ 1) = A[N] - 2 ^ N

接下来我们来推理数列B,不难看出 B[1] = 1,B[2] = 2,接下来推理 B[3]和 B[N]

首先考虑第一块不为红色和绿色的情况,剩余块需要有奇数个红色和偶数个绿色,排列数为 B[2] * 2。

接下俩考虑第一块为红色的情况,剩余块需要有偶数个红色和偶数个绿色,则剩余块的排列数等于 A[2]。

接下来考虑第一块为绿色的情况,剩余块需要有奇数个红色和奇数个绿色,则剩余块的排列数等于C[2]。

那么B[3] = B[2] * 2 + A[2] + C[2]

则 B[N] = B[N-1] * 2 + A[N-1] + C[N-1]

同时C[N-1] = A[N-1] - 2 ^ N

则可推出两个式子

式子1:B[N] = B[N-1] * 2 + A[N-1] * 2 - 2 ^ N

式子2:B[N+1] = B[N] * 2 + A[N] * 2  - 2 ^ (N + 1)

把A[N] = A[N-1] * 2 + B[N-1] * 2 代入式子2

式子2:B[N+1] = B[N] * 2 + A[N-1] * 4 + B[N-1] * 4 - 2 ^(N + 1)

把式子1乘以2

式子1:2 * B[N] = B[N-1] * 4 + A[N-1] * 4 - 2 ^ (N + 1)

式子2减式子1得到式子3

式子3:B[N+1] - 2 * B[N] = 2 * B[N] 

则 B[N+1] = B[N] * 4

把 B[N + 1] = B[N] * 4,且B1 = 1,代入A的递推式

得出 A[N+1] = A[N] * 2 + 2 ^ (2 * N - 1)。

再把递推式写成矩阵的形式。

那么定义矩阵A为 2 1 // 0 4,然后A = A的 n - 1次幂

最终结果为(A[0][0] * 2 + A[0][1] * 2) % M

三、代码

#include <iostream>
#include <vector>
using namespace std;
typedef vector<int> vec;
typedef vector<vec> mat;
const int M = 10007;
mat mul(mat &A, mat &B)
{mat C = mat(A.size(), vec(B[0].size()));for (int i = 0; i < A.size(); i++){for (int j = 0; j < B[0].size(); j++){for (int k = 0; k < B.size(); k++){C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % M;}}}return C;
}
mat pow(mat &A, int N)
{mat B = mat(A.size(), vec(A[0].size()));for (int i = 0; i < B.size(); i++){B[i][i] = 1;}while (N > 0){if (N & 1){B = mul(B, A);}A = mul(A, A);N >>= 1;}return B;
}
void solve(int N)
{mat A = mat(2, vec(2));A[0][0] = 2;A[0][1] = 1;A[1][1] = 4;A = pow(A, N - 1);int res = (A[0][0] * 2 + A[0][1] * 2) % M;printf("%d\n", res);
}
int main()
{int T, N;scanf("%d", &T);while (T--){scanf("%d", &N);solve(N);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/194771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringSecurity 三更草堂 学习笔记

SpringSecurity从入门到精通 0. 简介 Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的…

前端笔记(二):CSS 选择器与特性

CSS&#xff08;层叠样式表&#xff09;是一种样式表语言&#xff0c;用于描述HTML或XML文档的呈现方式。它定义了如何在屏幕、纸张或其他媒体上显示文档的样式、布局和外观。 里面的代码由 选择器 { } 组成 体验 CSS CSS 可以让我们界面变得更加美观&#xff0c;这是 CSS 的…

同旺科技 分布式数字温度传感器 -- Modbus Poll测试

内附链接 1、数字温度传感器 主要特性有&#xff1a; ● 支持PT100 / PT1000 两种铂电阻&#xff1b; ● 支持 2线 / 3线 / 4线 制接线方式&#xff1b; ● 支持5V&#xff5e;17V DC电源供电&#xff1b; ● 支持电源反接保护&#xff1b; ● 支持通讯波特率1200bps、2…

YOLOv8 区域计数 | 入侵检测 | 人员闯入

大家好,昨天的 YOLOv8 新增加了一个功能,区域计数,用这个功能我们能实现很多的任务, 比如入侵检测,流量统计,人员闯入等,使用方式也非常的方便,但是一定要使用最新版的 YOLOv8 代码(2023/12/03更新的代码)。 低版本是不具备这个功能的,上面是演示效果。 使用非常的方…

计算机网络TCP篇③问答篇

目录 一、如何理解 TCP 是面向字节流协议 先来说说为什么 UDP 是面向报文的协议&#xff1f; 如果收到了两个 UDP 报文&#xff0c;操作系统是如何区分开的呢&#xff1f; 再说说为什么 TCP 是面向字节流的协议&#xff1f; 二、如何解决粘包问题&#xff1f; ①、固定消…

【强化学习算法】Q-learning原理及实现

实现代码github仓库&#xff1a;RL-BaselineCode 代码库将持续更新&#xff0c;希望得到您的支持⭐&#xff0c;让我们一起进步&#xff01; 文章目录 1. 原理讲解1.1 Q值更新公式1.2 ε-greedy随机方法 2. 算法实现2.1 算法简要流程2.2 游戏场景2.3 算法实现 3. 参考文章 1. 原…

DBS note7 (end):DB Design

目录 一、前言 二、引言 三、Entity-Relationship Models&#xff08;实体-关系模型&#xff09; 1、关系约束 三、函数依赖和正则化 1、BCNF分解 2、无损分解 3、依赖关系保留分解 一、前言 略读过一遍CS186&#xff0c;对于CS186来说&#xff0c;绝对不止这 7 篇笔记…

10. 哈希表

哈希表(hash table)&#xff0c;又称散列表&#xff0c;其通过建立键 key 与值 value 之间的映射&#xff0c;实现高效的元素查询。具体而言&#xff0c;我们向哈希表输入一个键 key &#xff0c;则可以在 \(O(1)\) 时间内获取对应的值 value 。 给定 n 个学生&#xff0c;每个…

Docker Registry(镜像仓库)——4

目录&#xff1a; 什么是 Docker Registry镜像仓库生活案例镜像仓库分类镜像仓库工作机制常用的镜像仓库镜像仓库命令 命令清单docker logindocker pulldocker pushdocker searchdocker logout镜像命令[部分] docker imagesdocker image inspectdocker tag容器命令[部分] dock…

通义灵码简单使用例子

首先我们需要了解到通义灵码的能力&#xff1a; 行/函数级实时续写&#xff1a; 当我们在 idea进行代码编写时(确认开启了自动云端生成的模式)&#xff0c;通义灵码会根据当前代码文件及相关代码文件的上下文&#xff0c;自动为你生成代码建议。你可以不用&#xff0c;也可以t…

Verilog 入门(九)(建模实例)

文章目录 建模的不同方式条件操作建模通用移位寄存器状态机建模Moore 有限状态机建模Mealy 型有限状态机建模 建模的不同方式 分别使用数据流方式、行为方式和结构方式对下图所示的电路进行建模&#xff1a; 数据流方式&#xff1a;使用连续赋值语句对电路建模 module Save_M…

viple模拟器使用(四):unity模拟器中实现两距离局部最优迷宫算法

名字解读 两距离&#xff1a;指的是左侧距离和右侧距离 局部最优&#xff1a;对当前状态来说最好的选择&#xff0c;至于整体能不能达到最优&#xff0c;是无法确定的。 从节点1到节点5&#xff0c;一共有3条路 第1条路线&#xff1a;1→2→4→5&#xff0c;对应的花销是&…

机器学习笔记 - 什么是模型量化压缩技术?

一、简述 我们都知道现实世界是连续的状态,而计算机世界是离散的状态,这是什么意思呢?我们看一下下图,最右边的马力欧(高清)的状态,可以想象现实世界是连续的状态,而电脑世界在图像上呈现的是一格一格子的状态(左图)是离散的状态。 所以在计算机世界如果想要…

51单片机应用从零开始(十)·指针

指针 C语言指针是一种保存变量地址的数据类型。它可以让程序直接访问内存中的数据&#xff0c;而不需要通过变量名来访问。指针变量存储的是一个地址&#xff0c;这个地址指向内存中的某个位置&#xff0c;该位置存储了一个值。 在C语言中&#xff0c;可以使用&运算符取得一…

【计算机网络笔记】物理层——数据通信基础

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

绝地求生在steam叫什么?

绝地求生在Steam的全名是《PlayerUnknowns Battlegrounds》&#xff0c;简称为PUBG。作为一款风靡全球的多人在线游戏&#xff0c;PUBG于2017年3月23日正式上线Steam平台&#xff0c;并迅速成为一部热门游戏。 PUBG以生存竞技为核心玩法&#xff0c;玩家将被投放到一个辽阔的荒…

CRM简单小结

思想 对于三层架构&#xff0c;一个模块对应一个controller&#xff0c;controller实际就是Servlet&#xff1b;一张表对应一个domain类对应一个dao接口对应一个mapper文件&#xff1b;service层没有严格规定&#xff0c;如果两张表内容相近&#xff0c;用一个service接口也可以…

数据结构:图文详解双向链表的各种操作(头插法,尾插法,任意位置插入,查询节点,删除节点,求链表的长度... ...)

目录 一.双向链表的概念 二.双向链表的数据结构 三.双向链表的实现 节点的插入 头插法 尾插法 任意位置插入 节点的删除 删除链表中第一次出现的目标节点 删除链表中所有与关键字相同的节点 节点的查找 链表的清空 链表的长度 四.模拟实现链表的完整代码 前言&am…

检测下我的饺子皮擀的怎么样(圆度)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 各位老铁周末愉快。 快乐的时间做充实的事&#xff0c;好久没有吃饺子了&#xff0c;俗话说好吃不过饺子。 我个人觉得会包饺子不算本事&#xff0c;会擀饺子皮…

Linux 上的容器技术

容器实现封闭的环境主要要靠两种技术&#xff0c;一种是看起来是隔离的技术&#xff0c;称为 namespace&#xff08;命名空间&#xff09;。在每个 namespace 中的应用看到的&#xff0c;都是不同的 IP 地址、用户空间、进程 ID 等。另一种是用起来是隔离的技术&#xff0c;称为…