一、题目

点此看题

二、解法

设f[i]f[i]f[i]为大小为2×i2\times i2×i的矩阵填充的方案数,首先考虑不放特殊格子(1×11\times 11×1),那么可以从f[i−1]f[i-1]f[i−1]和f[i−2]f[i-2]f[i−2]转移而来。考虑放特殊格子的情况,无论是放上面还是放下面,前面的格子的放法总是唯一的(和间隔的奇偶性有关),而且一定是要空两格的,设g[i]g[i]g[i]为大小为2×i2\times i2×i的矩阵只用2×12\times 12×1的小矩阵填充的方案数,那么f[i]f[i]f[i]还可以从2∑j=1i−3g[j]2\sum_{j=1}^{i-3} g[j]2∑j=1i−3​g[j]转移过来,综上我们可以写出转移方程:
f[i]=f[i−1]+f[i−2]+2(g[j−1]−1)f[i]=f[i-1]+f[i-2]+2(g[j-1]-1)f[i]=f[i−1]+f[i−2]+2(g[j−1]−1)这里对转移方程进行了简写,首先从dpdpdp的角度可得ggg是一个斐波那契数列,要证明一个结论:∑i=1ng[i]=g[n+2]−1\sum_{i=1}^n g[i]=g[n+2]-1∑i=1n​g[i]=g[n+2]−1,可以用归纳法,当n=1n=1n=1时成立,假设n=kn=kn=k时成立,那么∑i=1kg[i]+g[k+1]=g[k+2]−1+g[k+1]\sum_{i=1}^k g[i]+g[k+1]=g[k+2]-1+g[k+1]∑i=1k​g[i]+g[k+1]=g[k+2]−1+g[k+1],即∑i=1k+1g[i]=g[k+3]−1\sum_{i=1}^{k+1}g[i]=g[k+3]-1∑i=1k+1​g[i]=g[k+3]−1,故n=k+1n=k+1n=k+1时也成立,证毕。

显然上面的dpdpdp可以用矩阵加速,如果不会构造矩阵的童鞋可以看下面的图:

时间复杂度O(125×Tlog⁡n)O(125\times T\log n)O(125×Tlogn),贴个代码qwqqwqqwq。

#include <cstdio>
#include <cstring>
#define int long long
const int MOD = 1e9+7;
int read()
{int x=0,flag=1;char c;while((c=getchar())<'0' || c>'9') if(c=='-') flag=-1;while(c>='0' && c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();return x*flag;
}
int T,n;
struct Matrix
{int n,m,a[8][8];Matrix() {n=m=0;memset(a,0,sizeof a);}Matrix operator * (const Matrix &b) const{Matrix r;r.n=n;r.m=b.m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)for(int k=1;k<=b.m;k++){r.a[i][k]=(r.a[i][k]+a[i][j]*b.a[j][k])%MOD;r.a[i][k]=(r.a[i][k]+MOD)%MOD;}return r;}
}A,F;
Matrix qkpow(Matrix a,int b)
{Matrix r;r.n=r.m=a.n;for(int i=1;i<=r.n;i++)r.a[i][i]=1;while(b>0){if(b&1) r=r*a;a=a*a;b>>=1;}return r;
}
signed main()
{T=read();while(T--){n=read();if(n<=2){puts("0");continue;}A.n=A.m=F.n=5;F.m=1;A.a[1][1]=A.a[1][2]=A.a[2][1]=A.a[3][3]=A.a[3][4]=A.a[4][3]=A.a[5][5]=1;A.a[1][3]=2;A.a[1][5]=-2;F.a[3][1]=2;F.a[4][1]=F.a[5][1]=1;printf("%lld\n",(qkpow(A,n-2)*F).a[1][1]);}
}

[GXOI/GZOI2019]逼死强迫症相关推荐

  1. 【题解】Luogu-P5303 [GXOI/GZOI2019]逼死强迫症

    P5303 [GXOI/GZOI2019]逼死强迫症 Preface 矩阵题的登峰造极之作. Description 有 TTT 组数据. 对于每组数据,给定正整数 NNN,请求出用 (N−1)(N- ...

  2. 【详●析】[GXOI/GZOI2019]逼死强迫症

    [详●析][GXOI/GZOI2019]逼死强迫症 脑子不够用了... [题目大意] 在\(2\times N\)的方格中用\(N-1\)块\(2\times 1\)的方砖和\(2\)块\(1\tim ...

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

    P5303 [GXOI/GZOI2019]逼死强迫症 P5303 [GXOI/GZOI2019]逼死强迫症 说实在的这题不难,但是我推 Dp\tt DpDp 的时候却只和正解相差一点,最后还是看了题解 ...

  4. P5303 [GXOI/GZOI2019]逼死强迫症(斐波拉契、矩阵乘法)

    解析 非常妙的一个题,感受到了斐波拉契优美的归纳性质. 首先,不难发现只要两个1*1的位置固定,中间的摆法就固定了,而两边的方案都是经典的斐波拉契数列(设为 fif_ifi​). 那么枚举中间的间隔再 ...

  5. [GXOI/GZOI2019]逼死强迫症 题解

    传送门 题意:用n−1n-1n−1块大小为1×21\times21×2的砖和两块大小为1×11\times11×1的砖铺满2×n2\times n2×n的路,要求两块小砖不能有边相邻,求方案数. 这题 ...

  6. GXOI/GZOI2019 逼死强迫症 题解

    题目传送门 题目大意: 有一个 2×n2\times n2×n 的网格图,有 nnn 个 1×21\times 21×2 的方块,其中一个被劈开变成了两个 1×11\times 11×1 大小的方块, ...

  7. GXOI/GZOI2019题解

    GXOI/GZOI2019题解 P5300 [GXOI/GZOI2019]与或和 一眼题.. 显然枚举每个二进制位,答案就变成了全1子矩阵数量. 这个xjb推推,单调栈一下就行了. #include& ...

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

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

  9. [GXOI/GZOI2019]旧词——树链剖分+线段树

    题目链接: [GXOI/GZOI2019]旧词 对于$k=1$的情况,可以参见[LNOI2014]LCA,将询问离线然后从$1$号点开始对这个点到根的路径链修改,每次询问就是对询问点到根路径链查询即可 ...

最新文章

  1. linux中在vi编辑器中执行存盘退出命令是?
  2. pandas 笔记:合并操作
  3. HDOJ1874最短路【spfa】
  4. java 缓存 单例_单例模式应用:高速缓存和查找对象(转)
  5. Docker最全教程——从理论到实战(七)
  6. 华北水利水电大学c语言程序设计四_我校代表队在“中国高等计算机大赛——团体程序设计天梯赛” 中喜获佳绩...
  7. 数据库 数据库SQL语句一
  8. 江西省一级计算机考试试题,2江西省计算机一级考试试题
  9. Spring boot - 使用redis实现session共享
  10. 创建自己SQL Server Docker映像
  11. Profibus-DP智能从站开发过程中若干核心问题的探讨
  12. Python3异常-AttributeError: module 'sys' has no attribute 'setdefaultencoding'
  13. flamengo x ajax,Flamengo是什么意思
  14. Samba使用大全(绝对经典)
  15. Java实验-输出希腊字母表
  16. 刷题总结——寻宝游戏(bzoj3991 dfs序)
  17. 从零开始学习idea开发vue
  18. Python常用数字处理基本操作汇总
  19. IP地址的规划和设计方法(三)
  20. 您需要Administrators提供的权限才能对此文件进行更改

热门文章

  1. 智能投顾Betterment优于传统88%的收益率背后掩盖着什么真相?
  2. python剪刀石头布小游戏源码下载_Python Tkinter实现剪刀石头布小游戏
  3. 2020/09/29 鼠标移入 显示二维码或图片 移出隐藏
  4. mybatis批量入库(springboot mybatis 批量入库)
  5. STM32使用SWD下载
  6. 深入HotSpot虚拟机源码探究synchronized底层实现原理【万字总结synchronized】
  7. JavaScript 中 OnLoad事件用法总结
  8. php拖拽上传_JS实现的文件拖拽上传功能示例
  9. 千年服务器经验怎么修改,千年服务端加入江湖等级的脚本
  10. 南加大计算机游戏专业,南加州大学游戏设计项目有哪些课程?