题目大意:f(i)为fibonacci函数. g(i)=k*i+b,给定k,b,n,M求sum(f(g(i)) mod M for 0<=i<n
和
这道题很像,不过这道题有个地方不好想点儿.
我们把sum展开 = f(b) + f(k+b) + f(2k+b) + …… + f((n-1)k+b).
到这儿我们发现这个和函数不像上题那么好看出递推规律……那么这题的难点就在这儿……
自己推的时候就隐约觉得他们存在某种关系,但就是想不出来,后来看了解题报告才明白了……
通常时候我做fibonacci递推时是用 ( f(n), f(n-1) ) = (1, 1, 1, 0)^(n-1) * (f(1), f(o)) , 这样的话就不好把f(n)表示成一个形式比较好的具体表达式,现在我们用另一种方法表示f(n), 把上面那个矩阵递推关系变形一下得:
f(n) = (1, 1, 1, 0) ^ n 的右上角元素。
设A = (1, 1, 1, 0),我们就大胆的把f(n)表示成A^n (事实上这个正确性也好说明,因为求和用f(n)时都是加法,而加法是对应位置相加的,并不影响其他位置,也不会受其他位置影响,所以可以这样表示)
那么就有 sum = A^b + A^(k+b) + A^(2k+b) + …… + A^((n-1)k + b).
再变一下形式就很显然了: sum = A^b * (A^0 + A^k + A^2k + A^3k + …… + A^(n-1)k )
如果我们定义SUM(A, n) = A^1 + A^2 + …… + A^n, 那么sum = A^b * ( E + SUM(A^k, n) ). (别忘了sum实际上是矩阵的右上角元素)
#include
#include
#include
#include
#include
#include
#include
#include
#include