「GXOI / GZOI2019」逼死强迫症——斐波那契+矩阵快速幂
题目
【题目描述】
ITX351 要铺一条 $2 \times N$ 的路,为此他购买了 $N$ 块 $2 \times 1$ 的方砖。可是其中一块砖在运送的过程中从中间裂开了,变成了两块 $1 \times 1$ 的砖块! 
ITX351 由此产生了一个邪恶的想法:他想要在这条路上故意把两块 $1 \times 1$ 的砖块分开铺,**不让两块砖有相邻的边**,其他砖块可以随意铺,直到整条路铺满。这样一定可以逼死自身强迫症 sea5!
也许下面的剧情你已经猜到了——他为此兴奋不已,以至于无法敲键盘。于是,他请你帮忙计算一下,有多少种方案可以让自己的阴谋得逞。
【输入格式】
每个测试点包含多组数据,输入文件的第一行是一个正整数 $T$,表示数据的组数。注意各组数据之间是独立无关的。 
接下来 $T$ 行,每行包含一个正整数 $N$,代表一组数据中路的长度。
【输出格式】
输出应包含 $T$ 行,对于每组数据,输出一个正整数,表示满足条件的方案数。
由于答案可能非常的大,你只需要输出答案对 $1000000007 (10^9 + 7)$ 取模后的结果。
【样例输入】
3
1
2
4
【样例输出】
0
0
6
【数据范围与提示】
所有测试数据的范围和特点如下表所示:
|测试点编号|$N$ 的规模|$T$ 的规模|
|:-:|:-:|:-:|
|$1$|$N \le 10$|$T \le 10$|
|$2$|$N \le 10$|$T \le 10$|
|$3$|$N \le 10^5$|$T \le 50$|
|$4$|$N \le 10^5$|$T \le 50$|
|$5$|$N \le 10^5$|$T \le 50$|
|$6$|$N \le 2 \times 10^9$|$T \le 50$|
|$7$|$N \le 2 \times 10^9$|$T \le 50$|
|$8$|$N \le 2 \times 10^9$|$T \le 50$|
|$9$|$N \le 2 \times 10^9$|$T \le 500$|
|$10$|$N \le 2 \times 10^9$|$T \le 500$|
题解
可以发现,在两个 $ 1 \times 1 $ 的方砖中放的方案数是唯一的(因为上下交错),而且只要两个方砖间的距离 $ \geq 3 $ 就一定可以填(具体参照样例)
那么只要考虑左边和右边的方案数的乘积
对于一段空格,要么就是一个 $ 2 \times 1 $ 的方砖,要么就是 $ 1 \times 2 $ 的两个一起填
记 $ f[i] $ 表示前 $ i $ 个格的方案数,则有 $ f[i]=f[i-1]+f[i-2] $,这很斐波那契
那么 $ ans=\sum_{i-0}^{n-3}\sum_{j=0}^{n-i-3}f[i]\times f[j] $
这很卷积,但上 FFT 要 $ O(n\log n) $,显然过不去
斐波那契数列有一个性质 $ f[n+2]+1=\sum_{i=0}^{n}f[i] $
那么 $ ans=\sum_{i=0}^{n-3}f[i]\times (f[n-i-1]-1) $,$ 2\times 10^9 $ 依然过不去
(然后测试时我就不会了)
开始推式子
$ ans=\sum_{i=0}^{n-3}f[i]\times (f[n-i-1]-1) $
$ \ \ \ \ \ \ \ =1-f[n-1]+\sum_{i=0}^{n-3}f[i]\times f[n-i-1] $
记 $ s[n]=\sum_{i=0}^{n}f[i]\times f[n-i] $
$ \ \ \ \ \ \ \ \ \ \ \ = f[n]+f[n-1]+\sum_{i=0}^{n-2}f[i]\times f[n-i]$
$ \ \ \ \ \ \ \ \ \ \ \ =f[n]+f[n-1]+\sum_{i=0}^{n-2}f[i]\times (f[n-i-1]+f[n-i-2]) $
$ \ \ \ \ \ \ \ \ \ \ \ =f[n]+f[n-1]+\sum_{i=0}^{n-2}f[i]\times f[n-i-1]+\sum_{i=0}^{n-2}f[i]\times f[n-i-2] $
$ \ \ \ \ \ \ \ \ \ \ \ =f[n]+\sum_{i=0}^{n-1}f[i]\times f[n-i-1]+\sum_{i=0}^{n-2}f[i]\times f[n-i-2] $
$ \ \ \ \ \ \ \ \ \ \ \ =f[n]+s[n-1]+s[n-2] $
然后发现可以矩阵优化
$ \left\{ \begin{matrix} f[n-1]\\f[n-2]\\s[n-1]\\s[n-2] \end{matrix}\right\} \left\{ \begin{matrix} 1 \ 1 \ 0 \ 0 \\1 \ 0 \ 0 \ 0\\1 \ 1\ 1\ 1\ \\0\ 0\ 1\ 0 \end{matrix}\right\}=\left\{ \begin{matrix} f[n]\\f[n-1]\\s[n]\\s[n-1] \end{matrix}\right\} $
则 $ ans=1-f[n-1]+s[n-1]-f[n-2]\times f[1]-f[n-1]\times f[0] $
$ \ \ \ \ \ \ \ \ \ \ \ \ = 1+s[n-1]-2\times f[n-1]-f[n-2]$
然后就可以了(预处理矩阵会更快)
时间效率 $ O(T\log n\times 4^3) $
代码
#include<bits/stdc++.h>
#define LL long long
#define _(d) while(d(isdigit(ch=getchar())))
using namespace std;
int R(){
int x;bool f=;char ch;_(!)if(ch=='-')f=;x=ch^;
_()x=(x<<)+(x<<)+(ch^);return f?x:-x;}
const int N=1e5+,P=1e9+;
int n;
struct Matrix{
LL s[][];
Matrix(){memset(s,,sizeof s);}
void one(){
s[][]=s[][]=s[][]=s[][]=s[][]=s[][]=s[][]=s[][]=;
return;
}
void S(){s[][]=s[][]=s[][]=,s[][]=;return;}
Matrix friend operator *(Matrix a,Matrix b){
Matrix c;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
for(int k=;k<=;k++)
c.s[i][j]=(c.s[i][j]+a.s[i][k]*b.s[k][j])%P;
return c;
}
};
int power(){
n=R()-;
if(n<)return n==?:;
Matrix a,b,res;
a.one(),b.S(),res.one();
for(;n;n>>=,a=a*a)
if(n&)res=res*a;
b=res*b;
return ((+b.s[][]-b.s[][]-*b.s[][])%P+P)%P;
}
int main(){
for(int T=R();T--;)printf("%lld\n",power()*2ll%P);
return ;
}
「GXOI / GZOI2019」逼死强迫症——斐波那契+矩阵快速幂的更多相关文章
- 【LOJ】#3086. 「GXOI / GZOI2019」逼死强迫症
		
LOJ#3086. 「GXOI / GZOI2019」逼死强迫症 这个就是设状态为\(S,j\)表示轮廓线为\(S\),然后用的1×1个数为j 列出矩阵转移 这样会算重两个边相邻的,只要算出斐波那契数 ...
 - LOJ#3086. 「GXOI / GZOI2019」逼死强迫症(矩阵快速幂)
		
题面 传送门 题解 先考虑全都放\(1\times 2\)的方块的方案,设防\(i\)列的方案数为\(g_i\),容易推出\(g_i=g_{i-1}+g_{i-2}\),边界条件为\(g_0=g_1= ...
 - HDU 2855 斐波那契+矩阵快速幂
		
http://acm.hdu.edu.cn/showproblem.php?pid=2855 化简这个公式,多写出几组就会发现规律 d[n]=F[2*n] 后面的任务就是矩阵快速幂拍一个斐波那契模板出 ...
 - 2018年湘潭大学程序设计竞赛G又见斐波那契(矩阵快速幂)
		
题意 题目链接 Sol 直接矩阵快速幂 推出来的矩阵应该长这样 \begin{equation*}\begin{bmatrix}1&1&1&1&1&1\\1 & ...
 - 51Nod - 1242   斐波那契(快速幂)
		
斐波那契数列的定义如下: F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2) (1, 1, 2, 3, 5, 8, 13, 21, ...
 - hdu 4549 M斐波那契数列(快速幂 矩阵快速幂 费马小定理)
		
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549: 题目是中文的很容易理解吧.可一开始我把题目看错了,这毛病哈哈. 一开始我看错题时,就用了一个快速 ...
 - 「GXOI / GZOI2019」简要题解
		
「GXOI / GZOI2019」简要题解 LOJ#3083. 「GXOI / GZOI2019」与或和 https://loj.ac/problem/3083 题意:求一个矩阵的所有子矩阵的与和 和 ...
 - LOJ#3083.「GXOI / GZOI2019」与或和_单调栈_拆位
		
#3083. 「GXOI / GZOI2019」与或和 题目大意 给定一个\(N\times N\)的矩阵,求所有子矩阵的\(AND(\&)\)之和.\(OR(|)\)之和. 数据范围 \(1 ...
 - Loj #3085. 「GXOI / GZOI2019」特技飞行
		
Loj #3085. 「GXOI / GZOI2019」特技飞行 题目描述 公元 \(9012\) 年,Z 市的航空基地计划举行一场特技飞行表演.表演的场地可以看作一个二维平面直角坐标系,其中横坐标代 ...
 
随机推荐
- long_query_time 设置不生效问题
			
由于原来的慢查询日志太大了,有1G多,并且其中包含上一次查询优化前的慢sql,所以想收集最近两天的慢查询语句,故 mysql> show global variables like 'slow% ...
 - Gemini.Workflow 双子工作流入门教程五:业务表单开发
			
简介: Gemini.Workflow 双子工作流,是一套功能强大,使用简单的工作流,简称双子流,目前配套集成在Aries框架中. 下面介绍本篇教程:业务表单开发. 业务表单开发 业务表单的开发,和在 ...
 - POJ - 3278 Catch That Cow 【BFS】
			
题目链接 http://poj.org/problem?id=3278 题意 给出两个数字 N K 每次 都可以用三个操作 + 1 - 1 * 2 求 最少的操作次数 使得 N 变成 K 思路 BFS ...
 - em、pt、px和百分比
			
浏览器默认的字体大小为100%=16px=12pt=1em px像素(Pixel):是固定大小的单元.相对长度单位.像素px是相对于显示器屏幕分辨率而言的.一个像素等于电脑屏幕上的一个点(是你屏幕分辨 ...
 - kvm初体验之七:attach usb storage device to a VM
			
1. virsh attach-disk vm1 /dev/sdb sdc 将host上的/dev/sdb挂载到vm1的/dev/sdc上 2. virsh detach-disk vm1 sdc 将 ...
 - linux应用之jdk环境的安装(centos)
			
一.yum安装 1.执行:yum search jdk 已加载插件:fastestmirror, securityLoading mirror speeds from cached hostfile ...
 - bzoj2673
			
限制这么多 肯定是网络流 考虑连边 首先我们计算出每行最多放的棋子数$sx[i]$,每列最多放的棋子数$sy[i]$ 首先由源点向第$i$行连流量为$sx[i]$费用为$0$的边,第$i$列向汇点连流 ...
 - nginx 轮询模式 nginx_upstream_jvm_route 插件安装
			
使用nginx_upstream_jvm_route插件的目的是为了保证在轮询机制下的session的共享 前提:源码方式安装nginx.patch命令 1.下载nginx_upstream_jvm_ ...
 - 浏览器,tab页显示隐藏的事件监听--页面可见性
			
//监听浏览器tab切换,以便在tab切换之后,页面隐藏的时候,把弹幕停止 document.addEventListener('webkitvisibilitychange', function() ...
 - SimpliciTI协议地址分配
			
1.多个ED节点和AP正确连接后,AP都会给ED分配一个相应的地址.当某个ED出现意外,比如电源问题,和AP断开连接,AP并不将该ED节点的地址消除.当该ED恢复正常,重新申请加入网络时,AP会检测该 ...