牛牛的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];
    }
};
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务