SPOJ FIBOSUM && FIBOSUM2
Fibonacci数列定义为
$$f_n = f_{n-1}+f_{n-2}, \text{以及初值}f_0=0, f_1=1.$$
本文之讨论,皆在模$10^9+7$意义下。
给定$0 \le x \le y \le 10^9$,求$\sum_{i=x}^y f_i$。
解:
令$s_n = \sum_{i=1}^n f_i$,则
$$\begin{bmatrix} 1 & 1 & 0 \\ 0 & 1 & 1 \\ 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} s_{n-1} \\ f_n \\ f_{n-1} \end{bmatrix} = \begin{bmatrix} s_n \\ f_{n+1} \\ f_n \end{bmatrix}$$
于是$\sum_{i=x}^y f_i = s_y - s_{x-1}$,可用矩阵快速幂$O(\log x + \log y)$解决。
给定$0 \le c < k \le 2^{15}$,以及$0 < n \le 10^{18}$,求
$$\sum_{i=1}^n f_{ki+c}.$$
解:
令
$$M = \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix}$$
则
$$M \begin{bmatrix} f_n \\ f_{n-1} \end{bmatrix} = \begin{bmatrix} f_{n+1} \\ f_n \end{bmatrix}$$
$$M^n = \begin{bmatrix} f_{n+1} & f_n \\ f_n & f_{n-1} \end{bmatrix}$$
于是$(M^n)_{01} = f_n$,
$$\left( \sum_{i=x}^y M^i \right)_{01} = \sum_{i=x}^y f_i$$
进而
$$ \left( \sum_{i=1}^n M^{ki+c} \right)_{01} = \sum_{i=1}^n f_{ki+c}$$
借此我们令
$$A = \begin{bmatrix} I & M^k \\ 0 & M^k \end{bmatrix}$$
可以验证
$$A^n \begin{bmatrix} 0 \\ M^c \end{bmatrix} = \begin{bmatrix} \sum_{i=1}^n M^{ki+c} \\ M^{kn+c} \end{bmatrix}$$
可以利用矩阵快速幂在$O(4^3 \log n)$求得。
这样复杂度太高,我们继续优化。
设$f(\lambda) = \det (\lambda I - A)$是矩阵$A$的特征多项式,即
$$f(\lambda) = \lambda^4 - a_1 \lambda^3 - a_2 \lambda^2 - a_3 \lambda - a_4. $$
其中$a_1 = f_{k+1}+f_{k-1}+2, a_2 = -(f_{k+1}f_{k-1}-f_k^2+2(f_{k+1}+f_{k-1})+1), a_3 = 2(f_{k+1}f_{k-1}-f_kf_k)+f_{k+1}+f_{k-1}, a_4 = f_k^2-f_{k+1}f_{k-1}.$
由Hamilton-Cayley定理,$f(A) = 0$,即
$$A^4 = a_1 A^3 + a_2 A^2 + a_3 A + a_4 I.$$
于是我们可以利用多项式乘法,把$A^n$化为$A$的三次多项式。
假设$A^n = c_3 A^3 + c_2 A^2 + c_1 A^1 + c_4$,并令$s_n = \sum_{i=1}^n f_{ki+c}$,有
$$s_n = \sum_{i=0}^3 c_is_i = c_1s_1+c_2s_2+c_3s_3$$
时间复杂度$O(4^2 \log n)$。
我们仍可继续优化,考虑到Fibonacci数列在模$10^9+7$下的循环节是$2 \times 10^9+16$,并且
$$\sum_{i=1}^{2 \times 10^9+16} f_{ki+c} \equiv \sum_{i=1}^{2 \times 10^9+16} f_{i} \equiv 0 \pmod {10^9+7}.$$
于是
$$s_n \equiv s_{n \bmod (2 \times 10^9+16)}.$$
则可以把$n$限制到 int 范围内。
P.S. 可构造3阶矩阵。令
$$ A = \begin{bmatrix} 1 & 1 & 0 \\ 0 & f_{k+1} & f_k \\ 0 & f_k & f_{k-1} \end{bmatrix}. $$
有
$$ A^n \begin{bmatrix} 0 \\ f_{k+c} \\ f_{k+c-1} \end{bmatrix} = \begin{bmatrix} s_n \\ f_{k(n+1)+c} \\ f_{k(n+1)+c-1} \end{bmatrix}. $$
其特征函数$f(\lambda) = \lambda^3 - a_1 \lambda^2 - a_2 \lambda - a_3$,其中 $a_1 = f_{k+1}+f_{k-1}+1, a_2 = f_k^2-f_{k+1}f_{k-1}-f_{k+1}-f_{k-1}, a_3 = f_{k+1}f_{k-1}-f_k^2$。时间复杂度$O(3^2 \log n)$。
SPOJ FIBOSUM && FIBOSUM2的更多相关文章
- BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 5217 Solved: 1233 ...
- SPOJ DQUERY D-query(主席树)
题目 Source http://www.spoj.com/problems/DQUERY/en/ Description Given a sequence of n numbers a1, a2, ...
- SPOJ GSS3 Can you answer these queries III[线段树]
SPOJ - GSS3 Can you answer these queries III Description You are given a sequence A of N (N <= 50 ...
- 【填坑向】spoj COT/bzoj2588 Count on a tree
这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...
- SPOJ bsubstr
题目大意:给你一个长度为n的字符串,求出所有不同长度的字符串出现的最大次数. n<=250000 如:abaaa 输出: 4 2 1 1 1 spoj上的时限卡的太严,必须使用O(N)的算法那才 ...
- 【SPOJ 7258】Lexicographical Substring Search
http://www.spoj.com/problems/SUBLEX/ 好难啊. 建出后缀自动机,然后在后缀自动机的每个状态上记录通过这个状态能走到的不同子串的数量.该状态能走到的所有状态的f值的和 ...
- 【SPOJ 1812】Longest Common Substring II
http://www.spoj.com/problems/LCS2/ 这道题想了好久. 做法是对第一个串建后缀自动机,然后用后面的串去匹配它,并在走过的状态上记录走到这个状态时的最长距离.每匹配完一个 ...
- 【SPOJ 8222】Substrings
http://www.spoj.com/problems/NSUBSTR/ clj课件里的例题 用结构体+指针写完模板后发现要访问所有的节点,改成数组会更方便些..于是改成了数组... 这道题重点是求 ...
- SPOJ GSS2 Can you answer these queries II
Time Limit: 1000MS Memory Limit: 1572864KB 64bit IO Format: %lld & %llu Description Being a ...
随机推荐
- VUE 自定义组件之间的相互通信
一.自定义组件 1.全局自定义组件 我们在var vm = new Vue({});的上面并列写上Vue.component('自定义组件名',{组件对象});来完成全局自定义组件的声明.示例代码如下 ...
- Oracle版本–EBS R12.1.1
select * from v$version; Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Productio ...
- jmeter Plugins Manager插件管理
在 https://jmeter-plugins.org/downloads/all/ 下载插件,放到lib/ext Download plugins-manager.jar and put it i ...
- MongoDB---出现no write has been done on this connection解决方式
no write has been done on this connection 这个问题出现了好几天.日志里面一天出现几十次no write has been done on this conne ...
- Office转SWF的一些感想(Office2007和Office2010)
Office2007需要借助SaveAsPDFandXPS的插件完成,Office2010可以直接兼容. Office2PDF主要采用的是 Microsoft.Office.Interop的方式进行, ...
- html中跳转方法(含设定时间)
脚本方式 如: <script language="JavaScript" type="text/JavaScript"> <!-- wind ...
- 【转载】C#中回滚TransactionScope的使用方法和原理
TransactionScope只要一个操作失败,它会自动回滚,Complete表示事务完成 实事上,一个错误的理解就是Complete()方法是提交事务的,这是错误的,事实上,它的作用的表示本事务完 ...
- HDU 6096 String 排序 + 线段树 + 扫描线
String Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) Problem De ...
- aop中获取方法的注解
@Around(value="@annotation(apiLog)") public Object around(ProceedingJoinPoint pjp, ApiLog ...
- file类简单操作
file类可表示文件或文件夹 import java.io.File; import java.io.FilenameFilter; import java.io.IOException; impor ...