【Week14作业 D】Q老师染砖【矩阵快速幂优化dp】

2023-05-16

题意:

衣食无忧的 Q老师 有一天突发奇想,想要去感受一下劳动人民的艰苦生活。
具体工作是这样的,有 N 块砖排成一排染色,每一块砖需要涂上红、蓝、绿、黄这 4 种颜色中的其中 1 种。且当这 N 块砖中红色和绿色的块数均为偶数时,染色效果最佳。
为了使工作效率更高,Q老师 想要知道一共有多少种方案可以使染色效果最佳,你能帮帮他吗?

第一行为 T,代表数据组数。(1 ≤ T ≤ 100)
接下来 T 行每行包括一个数字 N,代表有 N 块砖。(1 ≤ N ≤ 1e9)

输出满足条件的方案数,答案模 10007。


思路:

令A[i]表示i个格子,红绿均为偶数的染色方案数;
B[i]表示i个格子,红绿均为奇数的染色方案数;
C[i]表示i个格子,红绿有一个为偶数的染色方案数。
则dp转移方程为:
A[i]=2* A[i-1]+C[i-1], B[i]=2* B[i-1]+C[i-1], C[i]=2* A[i-1]+2* B[i-1]+2* C[i-1]。
可以得出矩阵快速幂:
在这里插入图片描述
通过矩阵快速幂的板子(记得取余10007)可以计算出中间矩阵[2 0 1 0 2 1 2 2 2]的n-1次方,最后答案就是A[N]。


总结:

一道矩阵快速幂优化dp的题目,在列出dp转移方程的基础上使用了矩阵快速幂来优化。


代码:

#include <iostream>
#include <string.h>
using namespace std;

int t,n;
const int m=10007,N=3;
struct Matrix
{
	int x[N][N];
	Matrix operator * (const Matrix &t)	const
	{
		Matrix ret;
		for(int i=0;i<N;i++)
		{
			for(int j=0;j<N;j++)
			{
				ret.x[i][j]=0;
				for(int k=0;k<N;k++)
				{
					ret.x[i][j]+=x[i][k]*t.x[k][j];
					ret.x[i][j]%=m;
				}
			}
		}
		return ret;
	}
	Matrix ()
	{
		memset(x,0,sizeof(x));
	}
	Matrix (const Matrix &t)
	{
		memcpy(x,t.x,sizeof(x));
	}
};
Matrix quick_pow(Matrix a,int x)
{
	Matrix ret;
	for(int i=0;i<N;i++)
		for(int j=0;j<N;j++)
			ret.x[i][j]=0;
	for(int i=0;i<N;i++)
		ret.x[i][i]=1;
	while(x)
	{
		if(x&1)
			ret=ret*a;
		a=a*a;
		x>>=1;
	}
	return ret;
}
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n;
		int init[3]={2,0,2};
		//int a1=2,b1=0,c1=2;
		Matrix ma;
		ma.x[0][0]=2,ma.x[0][1]=0,ma.x[0][2]=1;
		ma.x[1][0]=0,ma.x[1][1]=2,ma.x[1][2]=1;
		ma.x[2][0]=2,ma.x[2][1]=2,ma.x[2][2]=2;
		if(n==1)
			cout<<2<<endl;
		else
		{
			Matrix mat=quick_pow(ma,n-1);
			int ans=0;
			for(int i=0;i<3;i++)
				ans+=mat.x[0][i]*init[i],ans=ans%m;
			cout<<ans<<endl;
		}
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Week14作业 D】Q老师染砖【矩阵快速幂优化dp】 的相关文章

随机推荐

  • vue在引入外部js文件时可以使用this的方法

    在使用iview的table组件时 xff0c 需要从外部引入column js文件 xff0c 发现在外部文件种无法使用 this xff0c 参考了一下网上的文章 xff0c 写了以下方法 xff1a 1 首先在外部js文件中加入一个内
  • 解决 npm ERR! node-sass 和 gyp ERR! node-gyp 报错问题

    一 需要安装 msbuild 微软构建工具 span class token function npm span span class token function install span windows build tools span
  • Permutation 排列组合,主要是字符串的排列offer上的题目,还有leetcode的组合

    一个简洁版的结果过程说明 xff0c 固定一个位 xff0c 变换其他位 a b c d a b d c a c b d a c d b a d c b a d b c void perm char list int i int n int
  • winpcap编程函数介绍

    1 int pcap findalldevs pcap if t char 说明 xff1a 用来获得网卡的列表 参数 xff1a 指向pcap if t 类型的列表的指针的指针 char型指针 当打开列表错误时返回错误信息 返回值 为in
  • shell脚本实现数据库自动备份

    自动备份参考一 三步骤即可 xff0c 二步骤实现备份成功的同时推送消息到钉钉群 xff08 可省略 xff09 一 shell脚本实现数据库自动备份内容如下 xff08 我将脚本名称命名为back sh xff09 xff08 可复制以下
  • 【Week4 CSP B】咕咕东想吃饭【模拟】

    题意 xff1a 一共有n天 xff0c 每天需要买ai个生煎 共有两种购买方式 xff1a 在某一天一次性买两个 xff0c 或者为今明两天各买一个 每种购买方式都可以使用无数次 请问是否能每天恰好买ai个生煎 xff08 最后一天不能用
  • 【Week4 CSP C】可怕的宇宙射线【dfs剪枝】

    题意 xff1a 宇宙射线会在无限的二维平面上传播 xff08 可以看做一个二维网格图 xff09 xff0c 初始方向默认向上 宇宙射线会在发射出一段距离后分裂 xff0c 向该方向的左右45度方向分裂出两条宇宙射线 xff0c 同时威力
  • 【Week4作业 A】DDL的恐惧【贪心】

    题意 xff1a 有n个作业 1 lt 61 n lt 61 1000 xff0c 每个作业都有自己的DDL与平时分 请安排做作业的顺序 xff0c 拿到最多的平时分 输入 xff1a 共T个测试样例 xff0c 每个测试样例共三行 xff
  • 【Week5作业 C】平衡字符串【尺取法】

    题意 xff1a 一个长度为n xff08 n是4的倍数 xff09 的字符串s xff0c 其中仅包含 Q W E 39 R 四种字符 若四种字符在字符串中出现次数均为n 4 xff0c 则其为一个平衡字符串 现可以将s中连续的一段子串替
  • 【Week8作业 A】区间选点II【差分约束】

    题意 xff1a 给定一个数轴上的n个区间 xff0c 要求在数轴上选取最少的点使得第i个区间 ai bi 里至少有ci个点 1 lt 61 n lt 61 50000 0 lt 61 ai lt 61 bi lt 61 50000 1 l
  • 【Week8作业 B】猫猫向前冲【拓扑排序】

    题意 xff1a 一共n只猫猫 xff0c 编号依次为1至n 有m场猫猫比赛 xff0c p1 p2表示猫猫p1赢了猫猫p2 现求字典序最小的名次序列 思路 xff1a 猫猫之间的胜负关系可以构成一张有向无环图 xff0c p1赢了p2等价
  • 【Week8作业 C】班长竞选【SCC缩点】

    题意 xff1a 大学班级选班长 xff0c n个同学均可以发表意见 若意见为A B xff0c 则表示A认为B合适 意见具有传递性 xff0c 即A认为B合适 xff0c B认为C合适 xff0c 则A也认为C合适 共m条意见 xff0c
  • 【Week9作业 A】咕咕东的目录管理器【模拟】

    题意 xff1a 咕咕东的雪梨电脑的操作系统在上个月受到宇宙射线的影响 xff0c 时不时发生故障 xff0c 他受不了了 xff0c 想要写一个高效易用零bug的操作系统 这工程量太大了 xff0c 所以他定了一个小目标 xff0c 从实
  • 【Week12作业 B】必做题-2【模拟】

    题意 xff1a zjm被困在一个三维的空间中 现在要寻找最短路径逃生 xff01 空间由立方体单位构成 zjm每次向上下前后左右移动一个单位需要一分钟 xff0c 且zjm不能对角线移动 空间的四周封闭 zjm的目标是走到空间的出口 是否
  • 【Week12作业 C】必做题-3【动态规划】

    题意 xff1a 东东每个学期都会去寝室接受扫楼的任务 xff0c 并清点每个寝室的人数 每个寝室里面有ai个人 1 lt 61 i lt 61 n 从第i到第j个宿舍一共有sum i j 61 a i 43 43 a j 个人 这让宿管阿
  • selenium重要功能应用

    当使用C 编写爬虫时 xff0c 以下是一些常用的爬虫框架 xff1a AngleSharp xff08 用于HTML解析 xff09 HtmlAgilityPack xff08 用于HTML解析 xff09 ScrapySharp xff
  • 【CSP201809-3】元素选择器【模拟】

    题意 思路 xff1a 用point来存储结构化文档 xff0c 里面string label string id为标签和id xff0c int c为所在层数 xff0c 两个点就为一层 读入结构化文档 xff1a 用getline读入一
  • 【Week14作业 B】Q老师与十字叉【模拟】

    题意 xff1a 思路 xff1a 存储网格图不可能开数组a 50000 50000 xff0c 发现n m lt 61 400000 xff0c 可以用a 400001 来存储 xff0c i j gt a i 1 m 43 j 读入数据
  • 【Week14作业 C】Q老师的考验【矩阵快速幂】

    题意 xff1a Q老师 对数列有一种非同一般的热爱 xff0c 尤其是优美的斐波那契数列 这一天 xff0c Q老师 为了增强大家对于斐波那契数列的理解 xff0c 决定在斐波那契的基础上创建一个新的数列 f x 来考一考大家 数列 f
  • 【Week14作业 D】Q老师染砖【矩阵快速幂优化dp】

    题意 xff1a 衣食无忧的 Q老师 有一天突发奇想 xff0c 想要去感受一下劳动人民的艰苦生活 具体工作是这样的 xff0c 有 N 块砖排成一排染色 xff0c 每一块砖需要涂上红 蓝 绿 黄这 4 种颜色中的其中 1 种 且当这 N