快速幂 + 数学

斐波那契

http://www.nowcoder.com/questionTerminal/2b9ba636f774405683868271a9fe903b

首先 用数学归纳法证明
斐波那契数列前n项平方和 等于 f[n] * f[n+1];
假设 第 n 项时满足 前n项平方和 等于 f[n] * f[n+1];
那么 第 n+1 项时 应该是
f[n] * f[n+1] + f[n+1] * f[n+1]
= f[n+1] * (f[n] + f [n+1] )
= f[n+1] * f[n+2] = 假设的情况
且 第 1 项 平方和 满足
证毕
定义 一个列向量 存放 (f[n+1] f[n] )T
根据矩阵的乘法性质 可以看出
1 1
1 0
这个矩阵乘以 列向量 (f[n+1] f[n])T 就等于 (f[n+2] f[n+1])T
所以 (f[n+1] f[n]) T
就等于 有 n-1 个
1 1
1 0
于 (f[2] f[1])T左乘
根据 矩阵 的结合率
可以先算二阶矩阵的乘积再与 (f[2] f[1])T左乘
就相当于 求 一个矩阵的n-1次 再乘以 一个列向量
可以定义一个结构体存放 二阶矩阵
1 1
1 0
然后 重载乘法 变成矩阵的乘法
再根据 非递归的快速幂 方法快速求出矩阵的n-1次

#include <stdio.h>
typedef long long ll;
const int mod = 1e9 + 7;
struct  Node {
    ll a[2][2] = {{1,1},{1,0}};
    Node operator* ( Node b ) { //重载乘号 
        Node x;
        x.a[0][0] = ( this->a[0][0] * b.a[0][0] ) % mod + ( this->a[0][1] * b.a[1][0] ) % mod;  
        x.a[0][1] = ( this->a[0][0] * b.a[0][1] ) % mod + ( this->a[0][1] * b.a[1][1] ) % mod;  
        x.a[1][0] = ( this->a[1][0] * b.a[0][0] ) % mod + ( this->a[1][1] * b.a[1][0] ) % mod;  
        x.a[1][1] = ( this->a[1][0] * b.a[0][1] ) % mod + ( this->a[1][1] * b.a[1][1] ) % mod; 
        return x;
    } 
}; 
/**
 *快速幂的非递归写法 只不过把数换成了矩阵 
 **/
Node quick ( Node a ,ll ans ) 
{ 
    if ( ans == 1) {
        return a;
    }  
    Node x ;
    ans--;
    while ( ans ) {
        if ( ans & 1 ) {
            x = x * a;
        }
        a = a * a;
        ans >>= 1 ;
    }
    return x;
}
int main()
{
    Node a ;
    ll n;
    scanf ("%lld", &n);
    if ( n == 1 ||  n == 2 ) {
        printf ("%lld\n",n);
        return 0;
    }
    a = quick ( a , n - 1 );     
    Node f ;
    f = f * a;
    ll fin = ( f.a[0][0] * f.a[1][0] ) % mod ;
    printf ("%lld\n",fin );
    return 0;
}
全部评论

相关推荐

03-01 19:30
已编辑
南京大学 Java
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
10789次浏览 93人参与
# 你的实习产出是真实的还是包装的? #
1927次浏览 42人参与
# 巨人网络春招 #
11351次浏览 223人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7596次浏览 43人参与
# 简历第一个项目做什么 #
31715次浏览 338人参与
# 重来一次,我还会选择这个专业吗 #
433489次浏览 3926人参与
# 米连集团26产品管培生项目 #
5987次浏览 216人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187161次浏览 1122人参与
# 牛客AI文生图 #
21442次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152400次浏览 888人参与
# 研究所笔面经互助 #
118935次浏览 577人参与
# 简历中的项目经历要怎么写? #
310271次浏览 4216人参与
# AI时代,哪些岗位最容易被淘汰 #
63684次浏览 825人参与
# 面试紧张时你会有什么表现? #
30507次浏览 188人参与
# 你今年的平均薪资是多少? #
213097次浏览 1039人参与
# 你怎么看待AI面试 #
180069次浏览 1257人参与
# 高学历就一定能找到好工作吗? #
64328次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76505次浏览 374人参与
# 我的求职精神状态 #
448085次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363425次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160658次浏览 1112人参与
# 校招笔试 #
471015次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务