牛牛的Fib序列
首先我们可以得到 f(n) 的递推公式: ,这个题可以有两种方法:
第一种也是比较复杂的一种,就是可以直接矩阵快速幂,求出矩阵来,求矩阵快速幂的方法就不在这里赘述了。
接下来重点是说一下第二种方法,我们可以发现f(n)是有规律的:
f(1) = a
f(2) = b
f(3) = b-a
f(4) = -a
f(5) = -b
f(6) = a-b
f(7) = a
f(8) = b
我们发现f(n)是有循环节的,且循环节为6。那么我们就可以只求出前6位的f(i),然后最后答案对6取模即可。但是需要注意的一点是f(i)可能为负数,需要注意负数取模问题。
代码如下:
class Solution { public: /** * * @param a int整型 * @param b int整型 * @param n int整型 * @return int整型 */ int solve(int a, int b, int n) { // write code here const int MOD = 1e9+7; int m[10]; m[0] = (a%MOD+MOD)%MOD; m[1] = (b%MOD+MOD)%MOD; for(int i=2; i<6; i++) { m[i] = (m[i-1]-m[i-2]); m[i] = (m[i]%MOD+MOD)%MOD; } return m[(n-1)%6]; } };