牛牛的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];
}
};
查看14道真题和解析