[GXOI/GZOI2019]逼死强迫症
一、题目
点此看题
二、解法
设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−3g[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=1ng[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=1kg[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+1g[i]=g[k+3]−1,故n=k+1n=k+1n=k+1时也成立,证毕。
显然上面的dpdpdp可以用矩阵加速,如果不会构造矩阵的童鞋可以看下面的图:
时间复杂度O(125×Tlogn)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]逼死强迫症相关推荐
- 【题解】Luogu-P5303 [GXOI/GZOI2019]逼死强迫症
P5303 [GXOI/GZOI2019]逼死强迫症 Preface 矩阵题的登峰造极之作. Description 有 TTT 组数据. 对于每组数据,给定正整数 NNN,请求出用 (N−1)(N- ...
- 【详●析】[GXOI/GZOI2019]逼死强迫症
[详●析][GXOI/GZOI2019]逼死强迫症 脑子不够用了... [题目大意] 在\(2\times N\)的方格中用\(N-1\)块\(2\times 1\)的方砖和\(2\)块\(1\tim ...
- P5303 [GXOI/GZOI2019]逼死强迫症 题解
P5303 [GXOI/GZOI2019]逼死强迫症 P5303 [GXOI/GZOI2019]逼死强迫症 说实在的这题不难,但是我推 Dp\tt DpDp 的时候却只和正解相差一点,最后还是看了题解 ...
- P5303 [GXOI/GZOI2019]逼死强迫症(斐波拉契、矩阵乘法)
解析 非常妙的一个题,感受到了斐波拉契优美的归纳性质. 首先,不难发现只要两个1*1的位置固定,中间的摆法就固定了,而两边的方案都是经典的斐波拉契数列(设为 fif_ifi). 那么枚举中间的间隔再 ...
- [GXOI/GZOI2019]逼死强迫症 题解
传送门 题意:用n−1n-1n−1块大小为1×21\times21×2的砖和两块大小为1×11\times11×1的砖铺满2×n2\times n2×n的路,要求两块小砖不能有边相邻,求方案数. 这题 ...
- GXOI/GZOI2019 逼死强迫症 题解
题目传送门 题目大意: 有一个 2×n2\times n2×n 的网格图,有 nnn 个 1×21\times 21×2 的方块,其中一个被劈开变成了两个 1×11\times 11×1 大小的方块, ...
- GXOI/GZOI2019题解
GXOI/GZOI2019题解 P5300 [GXOI/GZOI2019]与或和 一眼题.. 显然枚举每个二进制位,答案就变成了全1子矩阵数量. 这个xjb推推,单调栈一下就行了. #include& ...
- 【LOJ】#3086. 「GXOI / GZOI2019」逼死强迫症
LOJ#3086. 「GXOI / GZOI2019」逼死强迫症 这个就是设状态为\(S,j\)表示轮廓线为\(S\),然后用的1×1个数为j 列出矩阵转移 这样会算重两个边相邻的,只要算出斐波那契数 ...
- [GXOI/GZOI2019]旧词——树链剖分+线段树
题目链接: [GXOI/GZOI2019]旧词 对于$k=1$的情况,可以参见[LNOI2014]LCA,将询问离线然后从$1$号点开始对这个点到根的路径链修改,每次询问就是对询问点到根路径链查询即可 ...
最新文章
- linux中在vi编辑器中执行存盘退出命令是?
- pandas 笔记:合并操作
- HDOJ1874最短路【spfa】
- java 缓存 单例_单例模式应用:高速缓存和查找对象(转)
- Docker最全教程——从理论到实战(七)
- 华北水利水电大学c语言程序设计四_我校代表队在“中国高等计算机大赛——团体程序设计天梯赛” 中喜获佳绩...
- 数据库 数据库SQL语句一
- 江西省一级计算机考试试题,2江西省计算机一级考试试题
- Spring boot - 使用redis实现session共享
- 创建自己SQL Server Docker映像
- Profibus-DP智能从站开发过程中若干核心问题的探讨
- Python3异常-AttributeError: module 'sys' has no attribute 'setdefaultencoding'
- flamengo x ajax,Flamengo是什么意思
- Samba使用大全(绝对经典)
- Java实验-输出希腊字母表
- 刷题总结——寻宝游戏(bzoj3991 dfs序)
- 从零开始学习idea开发vue
- Python常用数字处理基本操作汇总
- IP地址的规划和设计方法(三)
- 您需要Administrators提供的权限才能对此文件进行更改
热门文章
- 智能投顾Betterment优于传统88%的收益率背后掩盖着什么真相?
- python剪刀石头布小游戏源码下载_Python Tkinter实现剪刀石头布小游戏
- 2020/09/29 鼠标移入 显示二维码或图片 移出隐藏
- mybatis批量入库(springboot mybatis 批量入库)
- STM32使用SWD下载
- 深入HotSpot虚拟机源码探究synchronized底层实现原理【万字总结synchronized】
- JavaScript 中 OnLoad事件用法总结
- php拖拽上传_JS实现的文件拖拽上传功能示例
- 千年服务器经验怎么修改,千年服务端加入江湖等级的脚本
- 南加大计算机游戏专业,南加州大学游戏设计项目有哪些课程?