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 ...
随机推荐
- mac 安装ANT
http://blog.csdn.net/crazybigfish/article/details/18215439 1.下载ant:官网下载 当前最新版是Apache Ant 1.9.3,可以下载那 ...
- mysql修改删除列,删除有外键依赖的列
–重命名表rename table t_softwareport to software_port; –建立外键alter table software_port add constraint fk_ ...
- 转:我们是怎么做Code Review的
我们是怎么做Code Review的 前几天看了<Code Review 程序员的寄望与哀伤>,想到我们团队开展Code Review也有2年了,结果还算比较满意,有些经验应该可以和大 ...
- 133. Clone Graph (3 solutions)——无向无环图复制
Clone Graph Clone an undirected graph. Each node in the graph contains a label and a list of its nei ...
- Collection接口和Collections类的简单区别和讲解
这里仅仅进行一些简单的比较,如果你想要更加详细的信息话,请自己百度. 1.Collection: 是集合类的上层接口.本身是一个Interface,里面包含了一些集合的基本操作. Collection ...
- C#高级编程六十九天----DLR简介 .在.NET中使用DLR(转载) 我也来说说Dynamic
DLR 一.近年来,在TIOBE公司每个月发布的编程语言排行榜中,C#总是能挤进前十名,而在最近十年来,C#总体上呈现上升的趋势.C#能取得这样的成绩,有很多因素,其中它在语言特性上的锐意进取让人印象 ...
- DASH----Desktop and mobile Architecture for System Hardware----桌面和移动系统硬件架构(DASH)计划
http://baike.baidu.com/subview/813787/11301142.htm http://sites.amd.com/cn/business/it-solutions/man ...
- 使用JXL对EXCLE的导入导出
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Da ...
- Python 包的制作(__init__.py)
如何制作一个自己的包:首先,需要创建一个文件夹,将其作为顶层包,在此文件夹内我们可以定义各个不同的子文件夹与 .py 文件作为各个子包与模块注意:在每个包文件夹下都需要有一个 __init__.py ...
- 基于bootstrap_登陆页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...