题目链接

LOJ:https://loj.ac/problem/3086

洛谷:https://www.luogu.org/problemnew/show/P5303

Solution

显然不考虑\(1\times 1\)的矩形就是斐波那契数列,设为\(g\),则\(g_n=g_{n-1}+g_{n-2}\)。

设考虑的方案数为\(f\),那么可以枚举放哪里得到一个暴力式子:

\[\begin{align}f_n&=2\sum_{i=1}^{n}\sum_{j=i+2}^{n}g_{i-1}\cdot g_{n-j}\\
f_n&=2\sum_{i=1}^{n}g_{i-1}\sum_{j=i+2}^{n}g_{n-j}\\
f_n&=2\sum_{j=3}^{n}g_{n-j}\sum_{i=1}^{j-2}g_{i-1}\\
f_n&=2\sum_{j=3}^{n}g_{n-j}s_{j-3}
\end{align}
\]

设\(s\)为\(g\)的前缀和。

然后我们考虑\(f_{n+1}\)用已知量凑出来:

\[\begin{align}
\frac{1}{2}f_{n+1}&=\sum_{i=3}^{n+1}g_{n+1-i}s_{i-3}\\
\frac{1}{2}f_{n+1}&=s_{n-2}+s_{n-3}+\sum_{i=3}^{n-1}g_{n+1-i}s_{i-3}\\
\frac{1}{2}f_{n+1}&=s_{n-2}+s_{n-3}+\sum_{i=3}^{n-1}(g_{n-i}+g_{n-i-1})s_{i-3}\\
\frac{1}{2}f_{n+1}&=s_{n-2}+s_{n-3}+\sum_{i=3}^{n}g_{n-i}s_{i-3}-s_{n-3}+\sum_{i=3}^{n-1}g_{n-i-1}s_{i-3}\\
f_{n+1}&=2s_{n-2}+f_n+f_{n-1}
\end{align}
\]

其实到这里已经可以矩阵维护了,但是那样矩阵会设的很大,对于前缀和我们考虑如何递推:

\[s_n=2+\sum_{i=2}^{n}g_i=2+\sum_{i=2}^{n}g_{i-1}+g_{i-2}=s_{n-1}+s_{n-2}+1
\]

那么变一下就是:

\[s_n=s_{n+2}-s_{n-1}-1=g_{n+2}-1
\]

那么我们只需要开\(5\times 5\)的矩阵维护就好了,复杂度\(O(125T\log n)\)。

#include<bits/stdc++.h>
using namespace std; void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
} void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');} #define lf double
#define ll long long #define pii pair<int,int >
#define vec vector<int > #define pb push_back
#define mp make_pair
#define fr first
#define sc second #define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++) const int maxn = 2e5+10;
const int inf = 1e9;
const lf eps = 1e-8;
const int mod = 1e9+7; int n,T; const int tmp[5][5] =
{{1,1,0,0,0},
{1,0,0,0,0},
{2,0,1,1,0},
{0,0,1,0,0},
{mod-2,0,0,0,1}}; int add(int x,int y) {return x+y>=mod?x+y-mod:x+y;}
int del(int x,int y) {return x-y<0?x-y+mod:x-y;}
int mul(int x,int y) {return 1ll*x*y-1ll*x*y/mod*mod;} struct Matrix {
int a[6][6];
Matrix () {memset(a,0,sizeof a);}
Matrix operator * (const Matrix &r) const {
Matrix res;
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
for(int k=0;k<5;k++)
res.a[i][j]=add(res.a[i][j],mul(a[i][k],r.a[k][j]));
return res;
}
void print() {
FOR(i,0,4){FOR(j,0,4)printf("%d ",a[i][j]);puts("");}puts("");
}
}; Matrix qpow(Matrix a,int x) {
Matrix res;for(int i=0;i<5;i++) res.a[i][i]=1;
for(;x;x>>=1,a=a*a) if(x&1) res=res*a;
return res;
} void solve() {
read(n);if(n<=2) return puts("0"),void();
Matrix ans,res;
FOR(i,0,4) FOR(j,0,4) res.a[i][j]=tmp[i][j];
ans.a[0][2]=2,ans.a[0][3]=1,ans.a[0][4]=1;
write((ans*qpow(res,n-2)).a[0][0]);
} int main() {
read(T);while(T--) solve();
return 0;
}

[LOJ3086] [GXOI2019] 逼死强迫症的更多相关文章

  1. [LOJ3086][GXOI/GZOI2019]逼死强迫症——递推+矩阵乘法

    题目链接: [GXOI/GZOI2019]逼死强迫症 设$f[i][j]$表示前$i$列有$j$个$1*1$的格子的方案数,那么可以列出递推式子: $f[i][0]=f[i-1][0]+f[i-2][ ...

  2. 【BZOJ5505】[GXOI/GZOI2019]逼死强迫症(矩阵快速幂)

    [BZOJ5505][GXOI/GZOI2019]逼死强迫症(矩阵快速幂) 题面 BZOJ 洛谷 题解 如果没有那两个\(1*1\)的东西,答案就是斐波那契数,可以简单的用\(dp\)得到. 大概是设 ...

  3. P5303 [GXOI/GZOI2019]逼死强迫症

    题目地址:P5303 [GXOI/GZOI2019]逼死强迫症 这里是官方题解 初步分析 从题目和数据范围很容易看出来这是一个递推 + 矩阵快速幂,那么主要问题在于递推的过程. 满足条件的答案一定是以 ...

  4. 【LOJ】#3086. 「GXOI / GZOI2019」逼死强迫症

    LOJ#3086. 「GXOI / GZOI2019」逼死强迫症 这个就是设状态为\(S,j\)表示轮廓线为\(S\),然后用的1×1个数为j 列出矩阵转移 这样会算重两个边相邻的,只要算出斐波那契数 ...

  5. 「GXOI / GZOI2019」逼死强迫症——斐波那契+矩阵快速幂

    题目 [题目描述] ITX351 要铺一条 $2 \times N$ 的路,为此他购买了 $N$ 块 $2 \times 1$ 的方砖.可是其中一块砖在运送的过程中从中间裂开了,变成了两块 $1 \t ...

  6. Swift 吐槽下Swift里一个逼死强迫症的语法:中缀语法

    中缀语法是OC里特有的一种,就是在函数的参数前面加一个解释词,让调用的时候明白该参数的含义 比如: -(void)processDataWithparamaA:(NSString *)paramaA ...

  7. [逼死强迫症 - C&C++设计风格选择.1] : 命名规范

    1.命名规范 本系列的第一篇,命名风格本就是有关艺术审美,没有美与丑的绝对标准,本文难免带有主观选择倾向,但是会尽量保持客观的态度归纳几种主流的命名风格,仅供参考.制定规范是为了方便团队沟通和利于代码 ...

  8. luogu P5303 [GXOI/GZOI2019]逼死强迫症

    传送门 只有两行,考虑递推,设\(f_i\)为没有那两个\(1*1\)的,前\(i\)列的方案,可以发现一次可以放一个竖的或两个横的,也就是\(f_i=f_{i-1}+f_{i-2}\) 再设\(g_ ...

  9. [GXOI/GZOI2019]逼死强迫症

    题目 设我们最后的答案是\(g_n\) 我们发现在最后竖着放一个\(2\times 1\)的,和横着放两个\(1\times 2\)的就可以区分开之前的方案了 所以如果仅仅使用\(1\times 2\ ...

随机推荐

  1. c语言中一种典型的排列组合算法

    c语言中的全排列算法和组合数算法在实际问题中应用非常之广,但算法有许许多多,而我个人认为方法不必记太多,最好只记熟一种即可,一招鲜亦可吃遍天 全排列: #include<stdio.h> ...

  2. C Primer Plus AND 菜鸟教程

    C语言概述 首先,windows 环境下安装 GCC编译环境 下载 MinGW 下载地址:http://sourceforge.net/projects/mingw/files/ 根据系统环境下载对应 ...

  3. 微信小程序根据状态换图

    在index.wxml中添加图片 <image bindtap="click" src="{{show?'/images/.png':'/images/.png'} ...

  4. 3D数据采集和重建

    3D数据采集和重建是从传感器数据生成三维或时空模型.一般而言,这些技术和理论适用于大多数或所有传感器类型,包括光学,声学,激光扫描,[1]雷达,热学,[2]地震.[3][4] 内容 ·        ...

  5. win10 无法使用内置管理员账户打开应用

    运行gpedit.msc 启用两项 如何登陆 win 10 账户? 进入 win 10 应用商店,下载一个软件,然后登陆即可

  6. Intellij IDEA 智能补全的 10 个姿势,太牛逼了。。

    一年多前,栈长那时候刚从 Eclipse 转型 IDEA 成功,前面转了好多次,都是失败史,都是泪..后面我就在微信公众号 "Java技术栈" 写了这篇文章:Intellij ID ...

  7. 范仁义html+css课程---3、图片和超链接

    范仁义html+css课程---3.图片和超链接 一.总结 一句话总结: img标签是图片标签,定义 HTML 页面中的图像 a标签是超链接标签,用于从一个页面链接到另一个页面. 1.img标签要点? ...

  8. Unity 现代室内环境场景高效流程视频教程 附源文件 中文字幕

    大小1.83G,中文字幕 章节内容:1.项目介绍2.准备maya工程文件3.素材资产(assets)结构4.管理unity中的maya资产5.整合场景6.unity游戏对象及材质7.第一人称控制器8. ...

  9. free中buffer 与 cache 的区别

    通常人们所说的Cache就是指缓存SRAM. SRAM叫静态内存,“静态”指的是当我们将一笔数据写入SRAM后,除非重新写入新数据或关闭电源,否则写入的数据保持不变. 由于CPU的速度比内存和硬盘的速 ...

  10. 通过OpenSSL来生成PEM格式的私钥、PKCS8格式的私钥、公钥|pfx格式的私钥、cer格式的公钥

    1.生成PEM格式RSA私钥 不对输出的文件内容进行加密 openssl genrsa -out private-rsa.key 对输出的文件内容进行加密(DES/AES128/AES256等) op ...