博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 4549 M斐波那契数列(矩阵幂)
阅读量:6039 次
发布时间:2019-06-20

本文共 1260 字,大约阅读时间需要 4 分钟。

题目链接:

题意:F[0]=a,F[1]=b,F[n]=F[n-1]*F[n-2]。

思路:手算一下可以发现,最后F[n]=a^x*b^y,其中x和y是连续的两项Fib。因此只要求出这两个系数x和y即可。注意这里A^x=A^(x%Phi(C)+Phi(C)) (mod C)。因此在求矩阵快速幂时模的数不是mod=1000000007,而是mod-1。

 

struct matrix{    i64 a[2][2];    void init(int x)    {        clr(a,0);        if(x) a[0][0]=a[1][1]=1;    }    matrix operator*(matrix p)    {        matrix ans;        ans.init(0);        int i,j,k;        FOR0(k,2) FOR0(i,2) FOR0(j,2)        {            ans.a[i][j]+=a[i][k]*p.a[k][j]%(mod-1);            ans.a[i][j]%=(mod-1);        }        return ans;    }    matrix pow(int n)    {        matrix ans,p=*this;        ans.init(1);        while(n)        {            if(n&1) ans=ans*p;            p=p*p;            n>>=1;        }        return ans;    }};matrix p;int a,b,n;i64 Pow(i64 a,i64 b){    i64 ans=1;    while(b)    {        if(b&1) ans=ans*a%mod;        a=a*a%mod;        b>>=1;    }    return ans;}int main(){    p.a[0][0]=p.a[1][0]=p.a[0][1]=1;    p.a[1][1]=0;    Rush(a)    {        RD(b,n);        if(n==0) PR(a);        else if(n==1) PR(b);        else        {            matrix temp=p.pow(n-2);            int x=(temp.a[0][1]+temp.a[1][1])%(mod-1);            int y=(temp.a[0][0]+temp.a[1][0])%(mod-1);            PR(Pow(a,x)*Pow(b,y)%mod);        }    }}

  

转载地址:http://tmrhx.baihongyu.com/

你可能感兴趣的文章
Android热修复升级探索——代码修复冷启动方案
查看>>
学校宿舍的深夜之思考
查看>>
VB.NET 生成DBF文件
查看>>
编译安装nginx 1.9.15
查看>>
我的友情链接
查看>>
新的开始~~~
查看>>
字符串的扩展
查看>>
存储过程中调用webservice
查看>>
神奇语言 python 初识函数
查看>>
Windows安装Composer出现【Composer Security Warning】警告
查看>>
四 指针与数组 五 函数
查看>>
硬盘空间满了
查看>>
dutacm.club Water Problem(矩阵快速幂)
查看>>
深入JVM内核--GC算法和种类
查看>>
iOS的AssetsLibrary框架访问所有相片
查看>>
读书笔记三
查看>>
数论 - 最小乘法逆元
查看>>
企业架构研究总结(22)——TOGAF架构开发方法(ADM)之信息系统架构阶段
查看>>
接口测试(三)--HTTP协议简介
查看>>
周志华《机器学习》课后答案——第4章.决策树
查看>>