第二场(A2-牛牛的Fib序列)

链接:https://ac.nowcoder.com/acm/contest/6357/A
来源:牛客网

题目描述:
牛牛重新定义了斐波那契数列,牛牛定义f(n) = f(n-1)+f(n+1); f(1)=a, f(2)=b, 现在给定初始值 a, b,现在求第n项f(n)%1000000007的值。
其中 1<=|x|, |y|, n<=10^9
备注:
最终的答案应是一个非负整数,如-1 % 1000000007 = 1000000006
解题思路:
根据f(n)=f(n-1)+f(n+1),有f(n+1)=f(n)-f(n-1)。假设f1=a,f2=b,找规律:
f1=a, f2=b, f3=b-a, f4=-a, f5=-b, f6=a-b, f7=a, f8=b, ...
可以看到数组每6个元素循环一次。那么我们只需要计算n在循环节的哪个位置即可,时间复杂度O(1)。注意返回结果非负。
代码:

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
        // f1 = a, f2 = b, f3 = b - a, f4 = -a, f5 = -b, f6 = a - b
        int m = 1e9 + 7;
        a = (a + m) % m;
        b = (b + m) % m;
        if(n == 1) return a;
        if(n == 2) return b;
        int f[] = {a, b, (b - a + m) % m, (-a + m) % m, (-b + m) % m, (a - b + m) % m};
        return f[(n + 5) % 6];
    }
};
全部评论

相关推荐

大方的大熊猫准备进厂:1.教育背景:你希望从事什么专业的工作你的主修课就是什么;成绩优秀是你应该做的,没什么可描述的,成绩不优秀也许人家在大学忙着创业呢?(成绩优秀不一定是好事,只能说明多元化的大学你上成了高中,没有真正上明白大学,反而体现了你死板,不爱社交,没有别的突出能力) 2.实践经历:你想表达的意思没有说清楚。你是说你会个性化服务,还是你有实习经历。如果没有带来,经济收益,表彰,更好的发展前景,那你还不如说说提升了自己哪些技能。你说有人给你送锦旗我都能明白你优秀,但是你说你会xxxx,你说这话谁信,证据呢。 3.入伍经历:你描述的就是你的工作职责或者你应该做的,并没有体现出来你把这个事情做好了,而且入伍经历并不能证明你能干好你要应聘的工作,不如只写经历其余所有内容都不写。 4.荣誉技能:重点突出一下,但不要过多描述,这些荣誉的含金量懂得都懂。 重点:你要应聘什么工作(具体岗位,实习生不具体),你的期望薪资
点赞 评论 收藏
分享
在秋招的小白菜很想养修勾:一眼 苍穹外卖+谷粒商城,项目换一换吧,可以找一些付费知识星球博主带带,避免烂大街。多投投大厂,背背八股,你这学历乱杀了,等实习经验到位,到时候大厂闭眼选
投递美团等公司7个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务