「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) $
代码
1 #include<bits/stdc++.h> 2 #define LL long long 3 #define _(d) while(d(isdigit(ch=getchar()))) 4 using namespace std; 5 int R(){ 6 int x;bool f=1;char ch;_(!)if(ch=='-')f=0;x=ch^48; 7 _()x=(x<<3)+(x<<1)+(ch^48);return f?x:-x;} 8 const int N=1e5+6,P=1e9+7; 9 int n; 10 struct Matrix{ 11 LL s[10][10]; 12 Matrix(){memset(s,0,sizeof s);} 13 void one(){ 14 s[1][1]=s[1][2]=s[2][1]=s[3][1]=s[3][2]=s[3][3]=s[3][4]=s[4][3]=1; 15 return; 16 } 17 void S(){s[1][1]=s[2][1]=s[4][1]=1,s[3][1]=2;return;} 18 Matrix friend operator *(Matrix a,Matrix b){ 19 Matrix c; 20 for(int i=1;i<=5;i++) 21 for(int j=1;j<=5;j++) 22 for(int k=1;k<=5;k++) 23 c.s[i][j]=(c.s[i][j]+a.s[i][k]*b.s[k][j])%P; 24 return c; 25 } 26 }; 27 int power(){ 28 n=R()-3; 29 if(n<1)return n==0?1:0; 30 Matrix a,b,res; 31 a.one(),b.S(),res.one(); 32 for(;n;n>>=1,a=a*a) 33 if(n&1)res=res*a; 34 b=res*b; 35 return ((1+b.s[3][1]-b.s[2][1]-2*b.s[1][1])%P+P)%P; 36 } 37 int main(){ 38 for(int T=R();T--;)printf("%lld\n",power()*2ll%P); 39 return 0; 40 }
View Code
转载于:https://www.cnblogs.com/chmwt/p/10834538.html
「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= ...
- 又见斐波那契~矩阵快速幂入门题
链接:https://www.nowcoder.com/acm/contest/105/G 来源:牛客网 题目描述 这是一个加强版的斐波那契数列. 给定递推式 求F(n)的值,由于这个值可能太大,请对 ...
- loj #3086. 「GXOI / GZOI2019」逼死强迫症
背景: 好像也没什么. 题目传送门: https://loj.ac/problem/3086 题意: 给一个2∗n2*n2∗n的矩阵,现在要用2∗(n−1)2*(n-1)2∗(n−1)的矩形和222块 ...
- 【LOJ #6617】「THUPC 2019」摆家具 / furniture(DP / BSGS / 矩阵快速幂)
传送门 首先显然k=lognk=lognk=logn 显然对于每个iii我们只用关注有多少位与询问的数字不同 考虑分成两个部分 先对每个数字iii求出与他有jjj位不同的数字价值之和 再求出ttt轮后 ...
- 【GXOI/GZOI2019】逼死强迫症(生成函数)
传送门 题解: 构建矩阵快速幂的做法基本上敢来做省选的人都会了,这里不谈了. 首先设fif_ifi表示斐波那契数列第iii项,我们知道1⋅11\cdot 11⋅1两侧都是斐波那契数列,得到: Fn= ...
- 【GXOI/GZOI2019】逼死强迫症【递推】【矩阵】
记住我们的约定 很明显今天我闲的没事儿. 出于种种原因P5300RE了5个点所以待会儿再说,, 这道题是个好题.而且是个很简单的假黑题 思维1:考虑如何从前面答案得到后面答案(递推) 设f(i)表示n ...
- 【洛谷P5303】【GXOI/GZOI2019】—逼死强迫症(斐波那契数列)
传送门 手玩一下可以显然的发现 ans=2∑i=0n−3∑j=0n−3−if[i+1]f[j+1]ans=2\sum_{i=0}^{n-3}\sum_{j=0}^{n-3-i}f[i+1]f[j+1] ...
- LOJ#3085. 「GXOI / GZOI2019」特技飞行(KDtree+坐标系变换)
题面 传送门 前置芝士 请确定您会曼哈顿距离和切比雪夫距离之间的转换,以及\(KDtree\)对切比雪夫距离的操作 题解 我们发现\(AB\)和\(C\)没有任何关系,所以关于\(C\)可以直接暴力数 ...
最新文章
- 汇聚开发者星星之火,华为鸿蒙系统有希望成为国产之光?
- Storing and Retrieving Images from SQL Server using Microsoft .NET
- c语言char转cstring,CString、TCHAR*、char*转换 | 时刻需
- java枚举的线程安全及序列化
- java抽象类代码_java – 抽象类和通用代码
- 老板放过我吧!我Java8还没用呢,又让我学习Java14
- PHP绿色集成环境在云服务器上的应用,PHPWAMP在服务器上搭建网站案例
- win10 动态磁盘 linux,windows10系统下基本磁盘变成动态磁盘了如何解决
- AT32F407/437 LWIP FreeRTOS Multicast
- 最值得看的科幻动作魔幻电影推荐(转)
- Java基础(二)标识符、变量、数据类型、运算符
- 【Excel VBA】银行卡信用卡卡号校验功能函数
- 2006年十二生肖开运大预言
- TP- LINK企业级vp-n路由器ipsec场景与实施(野蛮模式)
- composer安装依赖包
- ubuntu1804
- RFID人员定位设备具体配置
- maven中profile的使用详解
- xshell远程传输文件过程
- Maven 管理不同jdk版本的jar,war,eba
热门文章
- 免费开源的商城系统!可商用!推荐给你
- twitter如何以图搜图_中学智慧校园如何设计?可以看看这整套的校园CAD设计方案...
- python set集合的基本运算
- Java同步锁Synchronized底层源码和原理剖析
- 中职计算机联合体 模拟试题,2013年高职招生计算机类专业基础考试模拟试卷1.doc...
- Podman 保姆级使用教程,太顶了!
- 用户登录 JWT TOKEN
- OID,唯一性的标志
- 利用AST对抗js混淆(三) 控制流平坦化(Control Flow Flattening)的处理
- Linux系统和Windows系统打开文件方式