【BZOJ5505】[GXOI/GZOI2019]逼死强迫症(矩阵快速幂)
【BZOJ5505】[GXOI/GZOI2019]逼死强迫症(矩阵快速幂)
题面
题解
如果没有那两个\(1*1\)的东西,答案就是斐波那契数,可以简单的用\(dp\)得到。
大概是设\(f[i]\)表示当前除了到第\(i\)列的方案数,转移是考虑用\(2*1\)竖着覆盖一列还是\(2\)个\(1*2\)横着覆盖两列,得到转移\(f[i]=f[i-1]+f[i-2]\)。
现在回假设要在这一行放上第二个\(1*1\),那么直到前一个\(1*1\)所在列之前的所有方块都被唯一确定了,而左侧就是随便放的方案数,即斐波那契数列。
设\(g[i]\)表示上面的\(f[i]\),\(f[i]\)为答案,\(s[i]\)为\(g[i]\)前缀和。
那么\(f[i]=f[i-1]+f[i-2]+2h[i-3]\),即考虑当前在哪一行放上这个\(1*1\)的东西,有两种方案数,接下来可以在任何一个地方把这个东西补齐,而前面可以任意摆放。
根据斐波那契数列的性质,\(h[i-3]=g[i-1]-1\),所以拿矩阵快速幂维护一下斐波那契数列和\(dp\)数列就行了。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MOD 1000000007
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
const int N=5;
struct Matrix
{
int s[N][N];
void clear(){memset(s,0,sizeof(s));}
void init(){clear();for(int i=0;i<N;++i)s[i][i]=1;}
int*operator[](int x){return s[x];}
}A[32],B,P,Ans;
Matrix operator*(Matrix a,Matrix b)
{
Matrix c;c.clear();
for(int i=0;i<N;++i)
for(int j=0;j<N;++j)
for(int k=0;k<N;++k)
c[i][j]=(c[i][j]+1ll*a[i][k]*b[k][j])%MOD;
return c;
}
Matrix fpow(int b)
{
Matrix s;s.init();
for(int i=0;b;++i,b>>=1)
if(b&1)s=s*A[i];
return s;
}
int main()
{
B[0][2]=B[0][3]=B[0][4]=1;
P[0][1]=P[1][0]=P[1][1]=P[2][3]=P[3][2]=P[3][3]=P[4][4]=1;
P[2][1]=P[3][1]=2;P[4][1]=MOD-2;
A[0]=P;for(int i=1;i<32;++i)A[i]=A[i-1]*A[i-1];
int T=read();
while(T--)
{
int n=read();
if(n==1){puts("0");continue;}
if(n==2){puts("0");continue;}
Ans=B*fpow(n-2);
printf("%d\n",Ans[0][1]);
}
return 0;
}
【BZOJ5505】[GXOI/GZOI2019]逼死强迫症(矩阵快速幂)的更多相关文章
- [LOJ3086][GXOI/GZOI2019]逼死强迫症——递推+矩阵乘法
题目链接: [GXOI/GZOI2019]逼死强迫症 设$f[i][j]$表示前$i$列有$j$个$1*1$的格子的方案数,那么可以列出递推式子: $f[i][0]=f[i-1][0]+f[i-2][ ...
- 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\ ...
- LOJ#3086. 「GXOI / GZOI2019」逼死强迫症(矩阵快速幂)
题面 传送门 题解 先考虑全都放\(1\times 2\)的方块的方案,设防\(i\)列的方案数为\(g_i\),容易推出\(g_i=g_{i-1}+g_{i-2}\),边界条件为\(g_0=g_1= ...
- 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)
题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...
- 51nod 算法马拉松18 B 非010串 矩阵快速幂
非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...
随机推荐
- 计算两个latitude-longitude点之间的距离? (Haversine公式)
问题描述 如何计算纬度和经度指定的两点之间的距离?为了澄清,我想要距离公里;这些点使用WGS84系统,我想了解可用方法的相对准确性.最佳解决方案 这个link可能对您有帮助,因为它详细说明了使用Hav ...
- WinForm中DataGridView对XML文件的读取
转自http://www.cnblogs.com/a1656344531/archive/2012/11/28/2792863.html c#读取XML XML文件是一种常用的文件格式,例如Win ...
- 优雅地实现CSS Animation delay心得
话不多说直接开讲: 1.需求: 等待元素A的动画加载完,再加载B元素的动画(下图中A为大熊猫,B为下方卡片) 先来看下最后的效果啦: 2.初始思路: 在B元素的动画属性上加上delay(延迟,使得这个 ...
- C++雾中风景9:emplace_back与可变长模板
C++11的版本在vector容器添加了emplace_back方法,相对于原先的push_back方法能够在一定程度上提升vector容器的表现性能.所以我们从STL源码角度来切入,看看这两种方法有 ...
- Python集合set
集合 set 集合是无序的 集合的值是唯一的 求两个集合的关系: list1 = [1,4,5,7,3,6,7,9] list2 = set([2,6,0,66,22,8,4]) list3 = se ...
- 浅谈cookie,sessionStorage和localStorage
cookie:cookie在浏览器和服务器间来回传递 cookie数据不能超过4k 同时每次http请求都会携带cookie,所以cookie只适合保存很小的数据,比如会话标识 cookie只在设置的 ...
- 【BZOJ 3569】 DZY Loves Chinese II
题目连接: 传送门 题解: 先%一发大佬的题解. 考虑一个图,删除一些边以后不连通的条件为,某个联通块与外界所有连边都被删掉,而不只是生成树中一个树边与所以覆盖它的非树边(很容易举出反例). 那么考虑 ...
- 【Troywar love Maths】——莫比乌斯反演
2816. Troywar loves Maths ★★☆ 输入文件:Troy_1.in 输出文件:Troy_1.out 简单对比 时间限制:1 s 内存限制:256 MB [题目描述 ...
- bzoj 2588 树上主席树
主席树上树,对于每个节点,继承其父亲的,最后跑f[x]+f[y]-f[lca]-f[fa[lca]] 去重竟然要减一,我竟然不知道?? #include<cstdio> #include& ...
- [Noi2016]区间 BZOJ4653 洛谷P1712 Loj#2086
额... 首先,看到这道题,第一想法就是二分答案+线段树... 兴高采烈的认为我一定能AC,之后发现n是500000... nlog^2=80%,亲测可过... 由于答案是求满足题意的最大长度-最小长 ...