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

news2025/1/12 6:11:42

一、题目大意

我们要给排成一行的区块涂颜色,可以选择红、绿、蓝、黄四种,要求红和绿的块都必须是偶数个,求出最终的涂色方式,对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.coloradmin.cn/o/1281936.html

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

相关文章

SSL证书价格一年多少钱?

SSL证书价格一年多少钱并没有一个固定的答案&#xff0c;它取决于多种因素&#xff0c;包括您选择的证书类型、品牌、提供商以及您希望保护的域名数量等。 首先&#xff0c;我们需要了解SSL证书的种类。根据品牌和类型&#xff0c;SSL证书大致可分为域名认证SSL证书&#xff08…

代码随想录算法训练营第四十二天 _ 动态规划_01背包问题。

学习目标&#xff1a; 动态规划五部曲&#xff1a; ① 确定dp[i]的含义 ② 求递推公式 ③ dp数组如何初始化 ④ 确定遍历顺序 ⑤ 打印递归数组 ---- 调试 引用自代码随想录&#xff01; 60天训练营打卡计划&#xff01; 学习内容&#xff1a; 二维数组处理01背包问题 听起来…

成品短视频app源码开发,你需要知道的最新动向

随着移动互联网的快速发展&#xff0c;短视频行业正迅速崛起。越来越多的创业者和开发者将目光投向了成品短视频app源码开发领域。下面我们将深入探讨这一领域的最新动向&#xff0c;带您了解成品短视频app源码开发的趋势与前景 成品短视频app源码开发的前景和机遇 短视频内容…

Latex正文引用图片编号,防止某张图片删除或调整导致正文序号对应错误

一、背景 Latex真的是非常好用的论文排版工具&#xff0c;虽然不像word一样是“所见即所得”的可视化方式&#xff0c;但完全不用管格式&#xff0c;包括图片的排版&#xff0c;文字的缩进等等。这在word里调整起来真的是非常麻烦&#xff0c;特别是某个段落、图片修改后&…

最热门超声波清洗机有哪些?热门超声波清洗机推荐

眼镜党朋友第一次接触超声波清洗机应该是在眼镜店的时候&#xff0c;把眼镜拿给老板他几分钟就搞定眼镜清洗的&#xff0c;是的没有错&#xff0c;那个机器叫超声波清洗机&#xff0c;不需要自己动手就可把眼镜清洗干净的一款智能清洁工具&#xff0c;它的出现可以说是方便了我…

关于svn如何上传一个完整的项目

注意&#xff1a;请一定要按照该步骤进行操作&#xff0c;请上传新项目时将项目名称进行规范命名 例如原始文件是arrange_v2 将此项目需要注入新的医院 则命名为 arrange_某医院名称_门诊或者医技或者药房_v2 重新命名文件夹名称快捷键 &#xff08;F12&#xff09; 一 &…

中断方式的数据接收2

Echo实验 回忆之前的实验因为数据处理的过程可以瞬间完成所以可以把数据处理的操作放在中断服务函数中执行 但是数据处理要是时间过长就将数据缓存处理 当使用中断方式接收数据的时候 一般有两种方式 数据处理的时间较短可放在中断服务函数内处理&#xff08;就地处理&#…

北斗如何保障能源安全?中海达再赴石油石化盛会推广新技术

11月29日-30日&#xff0c;第三届中国石油石化网络安全应用研讨会暨北斗导航能源安全技术交流会在深圳召开。本次活动主题为“石油石化网络安全&#xff0c;新时代、新征程”&#xff0c;由中国石油学会北斗导航与通信专业委员会、中石油、国家管网等单位联合举办。中海达受邀携…

Mac安装Linux虚拟机(M3)

环境&#xff1a;先贴出本人的电脑配置 一、选择虚拟机软件、下载并安装 比较常用的有VMware Fution、VirtualBox、Paralles Desktop等&#xff0c;我选择了Paralles Desktop&#xff08;买电脑增了一年的免费使用&#x1f604;&#xff09;从官网下载试用就行&#xff0c;之前…

CSS 绝对定位问题和粘性定位介绍

目录 1&#xff0c;绝对定位问题1&#xff0c;绝对定位元素的特性2&#xff0c;初始包含块问题 2&#xff0c;粘性定位注意点&#xff1a; 1&#xff0c;绝对定位问题 1&#xff0c;绝对定位元素的特性 display 默认为 block。所以行内元素设置绝对定位后可直接设置宽高。脱离…

53.redis分布式缓存

目录 一、单机安装Redis。 二、Redis主从集群。 2.1.集群结构 2.2.准备实例和配置 2.3.启动 2.4.开启主从关系 2.5.测试 三、搭建哨兵集群。 3.1.集群结构 3.2.准备实例和配置 3.3.启动 3.4.测试 四、搭建分片集群。 4.1.集群结构 4.2.准备实例和配置 4.3.启动…

【AI读论文】大模型时代:AutoML的机遇、挑战与风险

Title&#xff1a;AutoML in the Age of Large Language Models: Current Challenges, Future Oportunities and Risks Paper&#xff1a;https://arxiv.org/pdf/2306.08107 I. 概要 本文主要阐述了在大模型时代&#xff0c;自动化机器学习&#xff08;AutoML&#xff09;与大型…

硬件基础:三极管

之前我们学习了二极管&#xff0c;二极管的最大特性就是单向导通性。 现在我们又有了新的需求&#xff0c;那就是将信号放大&#xff0c;之前学习的无源器件或者二极管&#xff0c;都无法做到这一点。所以&#xff0c;为了满足放大信号的需求&#xff0c;三极管就顺势而生。 最…

贸易公司ERP用什么软件好

不同行业的贸易公司有不同的业务结构和管理模式&#xff0c;日常经营管理过程中遇到的难点呈现多样化&#xff0c;而很多贸易公司在仓库、财务、销售、采购、订单、客户等业务一体化和部门协同效率等方面还有很多提升空间。 有些贸易公司涉及多仓库、多门店、多税制、多汇率、…

程序员如何养生?

程序员长期面对电脑屏幕&#xff0c;加班、压力大等因素容易导致身体不适&#xff0c;以下是一些养生建议&#xff1a; 多休息&#xff1a;保证每天充足的睡眠时间&#xff0c;不要熬夜&#xff0c;尽量避免加班。 平衡饮食&#xff1a;均衡饮食&#xff0c;多吃蔬菜水果&…

你不得不知道的工业镜头使用中的常见问题

镜头的基本功能就是实现光束变换&#xff08;调制&#xff09;&#xff0c;在机器视觉系统中&#xff0c;工业镜头的主要作用是将目标成像在图像传感器的光敏面上。工业镜头是机器视觉系统设计的重要环节。在实际应用过程中&#xff0c;会遇到以下常见问题。 1、Q&#xff1a;…

CSS新手入门笔记整理:CSS背景样式

背景颜色&#xff1a;background-color 语法 background-color:颜色值; 颜色值有两种 一种是“关键字”&#xff0c;指的是颜色的英文名称&#xff0c;如red、green、blue等。参考CSS 颜色名称。另外一种是“十六进制RGB值”&#xff0c;类似“#FBE9D0”形式的值。参考十六…

移动平均滤波的原理和C代码

移动平均滤波是一种简单有效的平滑信号的方法&#xff0c;它通过计算一系列数据点的平均值来减小信号中的波动。基本的移动平均滤波方法有两种&#xff1a;简单移动平均&#xff08;SMA&#xff09;和指数加权移动平均&#xff08;EWMA&#xff09;。 简单移动平均滤波&#xf…

封装了一个顺滑嵌套滚动的框架

首先查看效果图 就是开始滚动的时候&#xff0c;上面的头部和下面的内容是 一起滚动的&#xff0c;但是当滚动到segment 的时候&#xff0c;segment 是悬停 的&#xff0c;下面的tableView是分区的 架构设计 我们设计一个架构&#xff0c;以下面的tablView为主体&#xff0…

Ubuntu系统配置深度学习环境之nvidia显卡驱动和cuda安装

前言 NVIDIA 显卡驱动是为了确保 NVIDIA 显卡能够正确运行而开发的软件。显卡驱动负责与操作系统通信&#xff0c;管理显卡的各种功能&#xff0c;并提供性能优化和兼容性保证。安装适用于特定显卡型号和操作系统版本的最新驱动程序是确保显卡能够正常工作的重要步骤。 CUDA 是…