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.mfbz.cn/a/214490.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

百度收录批量查询工具,免费SEO优化排名工具

拥有一个在搜索引擎中得到良好收录的网站对于个人和企业都至关重要。而百度&#xff0c;作为中国最大的搜索引擎&#xff0c;其收录情况直接影响着网站的曝光度和流量。 百度搜索引擎是中文用户获取信息的重要途径之一。而在这个竞争激烈的网络环境中&#xff0c;了解自己网站…

QT 中 QTimer 类 备查

基础 // 指定了父对象, 创建的堆内存可以自动析构 QTimer::QTimer(QObject *parent nullptr);// 根据指定的时间间隔启动或者重启定时器, 需要调用 setInterval() 设置时间间隔 void QTimer::start();// 启动或重新启动定时器&#xff0c;超时间隔为msec毫秒。 void QTimer::…

游泳馆会员服务预约管理系统预约小程序效果如何

游泳馆在各地每天都有大量用户前往&#xff0c;夏季室外、冬季室内也是学习游泳技术和休闲娱乐的好地方&#xff0c;而消费者大多是年轻人和家长带的孩子&#xff0c;这部分群体更显年轻化&#xff0c;因此在如今互联网环境下&#xff0c;传统商家需要进一步赋能客户消费路径。…

共识问题:区块链如何确认记账权?

区块链可以说是最近几年最热的技术领域之一&#xff0c;区块链起源于中本聪的比特币&#xff0c;作为比特币的底层技术&#xff0c;本质上是一个去中心化的数据库&#xff0c;其特点是去中心化、公开透明&#xff0c;作为分布式账本技术&#xff0c;每个节点都可以参与数据库的…

力扣 --- 最长公共前缀

题目描述&#xff1a; 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xff1a;"fl"…

蓝桥杯物联网竞赛_STM32L071_8_ADC扩展模块

原理图&#xff1a; 扩展模块原理图&#xff1a; RP1和RP2分别对应着AIN1和AIN2&#xff0c;扭动它们&#xff0c;其对应滑动变阻器阻值也会变化 实验板接口原理图&#xff1a; 对应实验板接口PB1和PB0 即AN1对应PB1, AN2对应PB0 CubMx配置&#xff1a; ADC通道IN8和IN9才对…

Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问

学习视频&#xff1a;孙哥说SpringMVC&#xff1a;结合Thymeleaf&#xff0c;重塑你的MVC世界&#xff01;&#xff5c;前所未有的Web开发探索之旅 衔接上文Spring MVC学习随笔-控制器(Controller)开发详解&#xff1a;控制器跳转与作用域&#xff08;一&#xff09; SpingMVC中…

智慧灯杆系统平台架构设计需要考虑的几个要点

智慧灯杆是一种集成了各种先进技术的道路照明设施。它不仅提供照明服务&#xff0c;还可以具有物联网技术、视频监控、环境监测、广播通讯、无线网络覆盖等多种功能。这些智能功能可以通过互联网进行控制和管理&#xff0c;从而实现智慧城市的建设。智慧灯杆能够提升城市的智能…

费解的开关

费解的开关 模拟一下开关的过程&#xff1a; 直接对第一行进行开关灯即可&#xff0c;那么第一行开关等的方案有多少个呢&#xff1f; 可以第一个想到的是5次&#xff0c;但实际上是25次&#xff0c;因为没有规定说只能开关一次吧。 那么如何获得这32种方案呢&#xff1f; 可…

【算法】前后缀分解题单⭐

文章目录 题单来源题目列表42. 接雨水238. 除自身以外数组的乘积2256. 最小平均差2483. 商店的最少代价代码1——前后缀数组代码2—— O ( 1 ) O(1) O(1)空间&#x1f402; 2420. 找到所有好下标2167. 移除所有载有违禁货物车厢所需的最少时间代码1——前后缀分解代码2——简洁…

【一个超简单的爬虫demo】探索新浪网:使用 Python 爬虫获取动态网页数据

探索新浪网&#xff1a;使用 Python 爬虫获取动态网页数据 引言准备工作选择目标新浪网的结构 编写爬虫代码爬取example.com爬取新浪首页部分内容解析代码注意&#xff1a; KeyError: href结果与展示 其他修改和适应注意事项 总结 引言 可以实战教爬虫吗&#xff0c;搭个环境尝…

利用STM32内置温度传感器实现温度监测系统

STM32微控制器是一款强大的嵌入式处理器&#xff0c;具有广泛的应用领域。其中&#xff0c;一些STM32微控制器内置了温度传感器&#xff0c;可以方便地实现温度监测功能。本文将详细介绍如何利用STM32内置温度传感器实现温度监测系统&#xff0c;并提供相应的示例代码。 一、硬…

python爬虫AES魔改案例:某音乐素材下载网

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、找出需要加密的参数 js运行 atob(‘aHR0cHM6Ly93d3cuYWlnZWkuY29tL3NvdW5kL2NsYXNzLw’) 拿到网址&#xff0c;F12打开调…

Nginx配置反向代理与负载均衡

Nginx配置反向代理与负载均衡 一、代理服务1.正向代理2.反向代理 二、实战场景-反向代理1.修改nginx配置 -> nginx.conf文件2.修改前端路径 三、实战场景-负载均衡1.热备2.轮询3.加权轮询4.ip_hash ​ Nginx (“engine x”) 是一个高性能的HTTP和反向代理服务器&#xff0c;…

ubuntu下快速搭建docker环境训练yolov5数据集

参考文档 yolov5-github yolov5-github-训练文档 csdn训练博客 一、配置环境 1.1 安装依赖包 前往清华源官方地址 选择适合自己的版本替换自己的源 # 备份源文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list_bak # 修改源文件 # 更新 sudo apt update &&a…

机器人阻抗控制性能及其实验验证

Impedance Control 机器人阻抗控制是一种控制方法&#xff0c;其目的是构建一个系统使得执行器&#xff08;如机械臂&#xff09;能同时控制力和位置。它基于阻抗模型&#xff0c;通过调节机器人的行为&#xff0c;以维持理想的动态关系。这种动态关系可以理解为机器人末端位置…

2024年天津财经大学珠江学院专升本专业课报名缴费操作流程

天津财经大学珠江学院专升本专业课报名缴费操作流程 天津财经大学珠江学院专升本专业课报名就是缴费&#xff0c;只需要使用中国银行交专业课报名费即可。 缴费操作流程如下&#xff1a; 登录中国银行手机 APP—点击“生活”—在界面 最左上角选择定位为“天津市”—点击“生…

设计模式之原型模式(2)--深拷贝的实现图文讲解

目录 前言Clone方法复制值类型变量引用类型成员变量只复制引用浅拷贝变深拷贝 示例详解注意事项总结 前言 在上一篇原型模式博客的基础上&#xff0c;今天第二次写&#xff0c;会详细讲解一下从浅拷贝到深拷贝的实现&#xff0c;我也有专门写过一篇关于浅拷贝与深拷贝的文章&am…

超大规模集成电路设计----MOS器件原理(二)

本文仅供学习&#xff0c;不作任何商业用途&#xff0c;严禁转载。绝大部分资料来自----数字集成电路——电路、系统与设计(第二版)及中国科学院段成华教授PPT 超大规模集成电路设计----MOS器件原理&#xff08;二&#xff09; 半导体物理知识补充介绍1. 半导体材料2. 固体类型…

Docker快速创建一个单机版的Jenkins实例

谈到 CI/CD&#xff0c;那便少不了这里面的佼佼者 Jenkins&#xff0c;正如 Jenkins 官网说的一样&#xff1a;“Build great things at any scale”&#xff0c;构建伟大&#xff0c;无所不能&#xff01; 话不多说&#xff0c;该篇文章将会带你使用 Docker 快速创建一个单机…
最新文章