题解 洛谷 P5303 【[GXOI/GZOI2019]逼死强迫症】
可以先去考虑没有\(1 \times 1\)的砖块的情况,对于最后一个位置只有两种情况,一个是竖着用一块砖铺设\(2 \times 1\),另一个为横着用两块砖铺设\(2 \times 2\)。
设没有\(1 \times 1\)的砖块的情况铺\(2 \times n\)的路的方案数为\(F_n\),根据上面的分析得\(F_n=F_{n-1}+F_{n-2}\),发现其为斐波那契数列。
用同样的方法考虑有\(1 \times 1\)的砖块的情况,设\(f_n\)表示按题意铺\(2 \times n\)的路的方案数,当最后的位置没有\(1 \times 1\)的砖块的影响时,其也是有两种放置情况,也就是说\(f_{i-1}\)和\(f_{i-2}\)对\(f_i\)都有贡献。
当最后一个位置需要铺设为\(1 \times 1\)的砖块时,可以发现该砖块到另一个砖块的区间的铺设情况是唯一的,所以这种情况决定方案数的是这两个\(1 \times 1\)的砖块形成的区间之前的\(2 \times 1\)砖块铺设情况。因此我们得:
\]
设\(S_i=\sum\limits_ {j=0}^{i}F_j\),得\(f_i=f_{i-1}+f_{i-2}+2S_{i-3}\)
然后就可以递推来求解了,但是发现\(n\)很大,所以用矩阵快速幂来加速递推。
设矩阵\(\begin{bmatrix} f_i&f_{i-1}&F_{i-2}&F_{i-3}&S_{i-3}\end{bmatrix}
\quad\),经过分析得,将其转移到\(\begin{bmatrix} f_{i+1}&f_i&F_{i-1}&F_{i-2}&S_{i-2}\end{bmatrix}
\quad\)的转移矩阵为:
\begin{bmatrix}
1&1&0&0&0\\
1&0&0&0&0\\
2&0&1&1&1\\
0&0&1&0&0\\
2&0&0&0&1\\
\end{bmatrix}
\quad
\]
然后每次询问矩阵快速幂一下就好了。
\(code:\)
#include<bits/stdc++.h>
#define p 1000000007
using namespace std;
typedef long long ll;
template<typename T> inline void read(T &x)
{
x=0;char c=getchar();bool flag=false;
while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
if(flag)x=-x;
}
ll T,n;
struct matrix
{
ll a[6][6];
matrix()
{
memset(a,0,sizeof(a));
}
}m,ans;
matrix operator *(const matrix &a,const matrix &b)
{
matrix c;
for(int i=0;i<5;++i)
for(int j=0;j<5;++j)
for(int k=0;k<5;++k)
c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j]%p+p)%p;
return c;
}
matrix qp(matrix x,ll y)
{
matrix e;
for(int i=0;i<5;++i) e.a[i][i]=1;
while(y)
{
if(y&1) e=e*x;
x=x*x,y>>=1;
}
return e;
}
ll m1[6][6]=
{
{2,0,1,1,1}
};
ll m2[6][6]=
{
{1,1,0,0,0},
{1,0,0,0,0},
{2,0,1,1,1},
{0,0,1,0,0},
{2,0,0,0,1}
};
int main()
{
read(T);
memcpy(ans.a,m1,sizeof(ans.a));
memcpy(m.a,m2,sizeof(m.a));
while(T--)
{
read(n);
if(n<3) puts("0");
else printf("%lld\n",(ans*qp(m,n-3)).a[0][0]);
}
return 0;
}
题解 洛谷 P5303 【[GXOI/GZOI2019]逼死强迫症】的更多相关文章
- P5303 [GXOI/GZOI2019]逼死强迫症
题目地址:P5303 [GXOI/GZOI2019]逼死强迫症 这里是官方题解 初步分析 从题目和数据范围很容易看出来这是一个递推 + 矩阵快速幂,那么主要问题在于递推的过程. 满足条件的答案一定是以 ...
- luogu P5303 [GXOI/GZOI2019]逼死强迫症
传送门 只有两行,考虑递推,设\(f_i\)为没有那两个\(1*1\)的,前\(i\)列的方案,可以发现一次可以放一个竖的或两个横的,也就是\(f_i=f_{i-1}+f_{i-2}\) 再设\(g_ ...
- 【BZOJ5505】[GXOI/GZOI2019]逼死强迫症(矩阵快速幂)
[BZOJ5505][GXOI/GZOI2019]逼死强迫症(矩阵快速幂) 题面 BZOJ 洛谷 题解 如果没有那两个\(1*1\)的东西,答案就是斐波那契数,可以简单的用\(dp\)得到. 大概是设 ...
- [LOJ3086][GXOI/GZOI2019]逼死强迫症——递推+矩阵乘法
题目链接: [GXOI/GZOI2019]逼死强迫症 设$f[i][j]$表示前$i$列有$j$个$1*1$的格子的方案数,那么可以列出递推式子: $f[i][0]=f[i-1][0]+f[i-2][ ...
- 洛谷 P5304 [GXOI/GZOI2019]旅行者(最短路)
洛谷:传送门 bzoj:传送门 参考资料: [1]:https://xht37.blog.luogu.org/p5304-gxoigzoi2019-lv-xing-zhe [2]:http://www ...
- 洛谷.5300.[GXOI/GZOI2019]与或和(单调栈)
LOJ BZOJ 洛谷 想了一个奇葩的单调栈,算的时候要在中间取\(\min\),感觉不靠谱不写了=-= 调了十分钟发现输出没取模=v= BZOJ好逗逼啊 题面连pdf都不挂了 哈哈哈哈 枚举每一位. ...
- [洛谷P5304][GXOI/GZOI2019]旅行者
题目大意: 有一张 \(n(n\leqslant10^5)\) 个点 \(m(m\leqslant5\times10^5)\) 条边的有向有正权图,有$k(2\leqslant k\leqslant ...
- [GXOI/GZOI2019]逼死强迫症
题目 设我们最后的答案是\(g_n\) 我们发现在最后竖着放一个\(2\times 1\)的,和横着放两个\(1\times 2\)的就可以区分开之前的方案了 所以如果仅仅使用\(1\times 2\ ...
- 【详●析】[GXOI/GZOI2019]逼死强迫症
[详●析][GXOI/GZOI2019]逼死强迫症 脑子不够用了... [题目大意] 在\(2\times N\)的方格中用\(N-1\)块\(2\times 1\)的方砖和\(2\)块\(1\tim ...
随机推荐
- 爬取B站弹幕并且制作词云
目录 爬取弹幕 1. 从手机端口进入网页爬取找到接口 2.代码 制作词云 1.文件读取 2.代码 爬取弹幕 1. 从手机端口进入网页爬取找到接口 2.代码 import requests from l ...
- vue开发搭建(npm安装 + vue脚手架安装)
一.概念 1.npm: Nodejs下的包管理器. 2.webpack: 它主要的用途是通过CommonJS的语法,把所有浏览器端需要发布的静态资源,做相应的准备,比如资源的合并和打包. 3.vue ...
- 删库吧,Bug浪——我们在同一家摸鱼的公司
那些口口声声, Bug越来越难写人的,应该盯着你们: 像我一样,我盯着你们,满眼恨意. IT积攒了几十年的漏洞, 所有的死机.溢出.404和超时, 像是专门为你们准备的礼物. 圈复杂度.魔鬼变量.内存 ...
- JAVA设计模式 3【创建型】理解工厂模式与抽象工厂模式
上一节我们已经学习了原型模式,稍微复习一下:通过重写Object 类的clone() 方法实现浅克隆,浅克隆也要实现Cloneable 标记接口.而深克隆则是将对象通过序列化和反序列化 的方式进行创建 ...
- java-递归(文件查找)
import java.io.File; /** * @Author: heq * @Date: 2020/6/23 20:51 */ public class Test { public stati ...
- 2020_06_18Mysql事务
1.事务的基本介绍 1.概念:一个包含多个步骤的事务,被事务管理,要么同时成功,要么同时失败. 2.操作: 2.1 开启事务:start transaction; 2.2 回滚:rollback; 2 ...
- IOC和DI的概念,以及Spring框架的介绍
对于Java开发者来说,Spring肯定是一个避不开的技术.所以准备系统的学下Spring框架. 我给自己设计的学习路线是这样的:首先阅读下Spring的官方文档(注意Spring官网上有很多项目,S ...
- 洛谷 P2648 赚钱
这道题其实就是求最长路顺便再判断一下正环而已. 这种题肯定要用SPFA的啦,有又正边权(因为最长路所以正边就相当于负边),又是正环(同理,相当于负环),SPFA专治这种问题. 当一个点入队多次的时候, ...
- Redis 6.0 访问控制列表ACL说明
背景 在Redis6.0之前的版本中,登陆Redis Server只需要输入密码(前提配置了密码 requirepass )即可,不需要输入用户名,而且密码也是明文配置到配置文件中,安全性不高.并且应 ...
- java语言进阶(一)_Object类_常用API
第一章 Object类 1.1 概述 java.lang.Object类是Java语言中的根类,即所有类的父类.它中描述的所有方法子类都可以使用.在对象实例化的时候,最终找的父类就是Object. 如 ...