[LOJ3086][GXOI/GZOI2019]逼死强迫症——递推+矩阵乘法
题目链接:
设$f[i][j]$表示前$i$列有$j$个$1*1$的格子的方案数,那么可以列出递推式子:
$f[i][0]=f[i-1][0]+f[i-2][0]$
$f[i][1]=2*f[i-1][0]+f[i-1][1]$
$f]i][2]=f[i-1][2]+f[i-2][2]+f[i-2][1]$
通过递推式子求出一个$6*6$的矩阵然后用矩阵乘法优化递推即可。
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int mod=1e9+7;
struct lty
{
int a[7][7];
lty(int x)
{
memset(a,0,sizeof(a));
for(int i=1;i<=6;i++)
{
a[i][i]=x;
}
}
lty operator *(lty s)
{
lty res(0);
for(int i=1;i<=6;i++)
{
for(int j=1;j<=6;j++)
{
for(int k=1;k<=6;k++)
{
res.a[i][j]=(res.a[i][j]+1ll*a[i][k]*s.a[k][j]%mod)%mod;
}
}
}
return res;
}
};
int n,T;
lty quick(int k)
{
lty f(0);
f.a[1][1]=1,f.a[4][1]=1;
f.a[1][2]=2,f.a[2][2]=1;
f.a[3][3]=1,f.a[5][3]=1;
f.a[6][3]=1,f.a[1][4]=1;
f.a[2][5]=1,f.a[3][6]=1;
lty g(1);
if(k<0)
{
return g;
}
while(k)
{
if(k&1)
{
g=g*f;
}
k>>=1;
f=f*f;
}
return g;
}
void solve(int n)
{
lty res=quick(n-2);
int ans=1ll*res.a[1][3]*2%mod;
ans=(ans+1ll*res.a[2][3]*4%mod)%mod;
ans=(ans+1ll*res.a[4][3]*1%mod)%mod;
ans=(ans+1ll*res.a[5][3]*2%mod)%mod;
printf("%d\n",ans);
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
solve(n);
}
}
[LOJ3086][GXOI/GZOI2019]逼死强迫症——递推+矩阵乘法的更多相关文章
- 【BZOJ5505】[GXOI/GZOI2019]逼死强迫症(矩阵快速幂)
[BZOJ5505][GXOI/GZOI2019]逼死强迫症(矩阵快速幂) 题面 BZOJ 洛谷 题解 如果没有那两个\(1*1\)的东西,答案就是斐波那契数,可以简单的用\(dp\)得到. 大概是设 ...
- P5303 [GXOI/GZOI2019]逼死强迫症
题目地址:P5303 [GXOI/GZOI2019]逼死强迫症 这里是官方题解 初步分析 从题目和数据范围很容易看出来这是一个递推 + 矩阵快速幂,那么主要问题在于递推的过程. 满足条件的答案一定是以 ...
- 【详●析】[GXOI/GZOI2019]逼死强迫症
[详●析][GXOI/GZOI2019]逼死强迫症 脑子不够用了... [题目大意] 在\(2\times N\)的方格中用\(N-1\)块\(2\times 1\)的方砖和\(2\)块\(1\tim ...
- 题解 洛谷 P5303 【[GXOI/GZOI2019]逼死强迫症】
可以先去考虑没有\(1 \times 1\)的砖块的情况,对于最后一个位置只有两种情况,一个是竖着用一块砖铺设\(2 \times 1\),另一个为横着用两块砖铺设\(2 \times 2\). 设没 ...
- luogu P5303 [GXOI/GZOI2019]逼死强迫症
传送门 只有两行,考虑递推,设\(f_i\)为没有那两个\(1*1\)的,前\(i\)列的方案,可以发现一次可以放一个竖的或两个横的,也就是\(f_i=f_{i-1}+f_{i-2}\) 再设\(g_ ...
- [GXOI/GZOI2019]逼死强迫症
题目 设我们最后的答案是\(g_n\) 我们发现在最后竖着放一个\(2\times 1\)的,和横着放两个\(1\times 2\)的就可以区分开之前的方案了 所以如果仅仅使用\(1\times 2\ ...
- HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- HDU 2604 Queuing(递推+矩阵)
Queuing [题目链接]Queuing [题目类型]递推+矩阵 &题解: 这题想是早就想出来了,就坑在初始化那块,只把要用的初始化了没有把其他的赋值为0,调了3,4个小时 = = 本题是可 ...
- hdu 2604 递推 矩阵快速幂
HDU 2604 Queuing (递推+矩阵快速幂) 这位作者讲的不错,可以看看他的 #include <cstdio> #include <iostream> #inclu ...
随机推荐
- DSAPI Wifi热点的扫描与连接
使用DSAPI扫描和连接Wifi热点,支持连接隐藏的SSID. 效果演示: 代码如下: Private Wifi As New DSAPI.网络.Wifi Private Sub Button1_Cl ...
- 玩玩小程序:使用 WebApi 交互打造原生的微信小程序 - 图灵小书架
使用 WebApi 交互打造原生的微信小程序 - 图灵小书架 目录 介绍 源码地址 扫一扫体验 代码分析 其它相关信息(互联网搜集) 介绍 定时抓取图灵社区官网的首页.最热.推荐和最新等栏目的相关图书 ...
- ITSA(IT Strategy and Architecture)方法介绍
Architecture Capability – At a Glance Architectural coherence part1 Architectural coherence part2 SA ...
- QQ登录的那些坑
这几天在项目上面实现qq登录的功能,当功能做好后发现,同一个qq号登录之后腾讯返回的openid并不一样....(天啦噜啊~)然后查询文档以及咨询客服才知道注册申请时是有一个固定的套路的(不得不说,如 ...
- 基于django的视频点播网站开发
项目名称 基于django的视频点播网站开发 项目背景 学习完毕python和django之后,想找个项目练练手,本来想写个博客项目练手,无奈别人已经写过了,所以笔者就打算写一个视频点播网站,因为笔者 ...
- MyDAL - .QueryOneAsync() 使用
索引: 目录索引 一.API 列表 .QueryOneAsync() .QueryOneAsync<M>() 如: .QueryOneAsync<Agent>() , 用于 单 ...
- javaFX笔记----ComboBox模仿qq账号下拉框删除账号
myComboBox.setCellFactory( new Callback<ListView<String>, ListCell<String>>() { @O ...
- C#标识符与关键字
标识符是指在程序中用来表示实物的单词,是分配给类型(类.结构.枚举.接口或委托).成员.变量或命名空间的名称.有效标识符必须遵循以下原则: 标识符不能以数字开头也不能包含空格: 标识符可以包含大小写字 ...
- MongoDB- 简单操作命令
MongoDB是基于集合操作的数据库 1.进入与退出 mongo / exit 2.库操作 显示所有库: show dbs; 查看当前所在库: db; 切换&使用某个库: use db_nam ...
- C语言面试程序阅读整理
一.数组和指针 1.数组和指针的存储 写出下面的输出结果: char str1[] = "abc"; char str2[] = "abc"; const ch ...