zoukankan      html  css  js  c++  java
  • Fibonacci数列(矩阵乘法快速幂)

    题目描述:
    定义:f0=f1=1, fn=fn-1+fn-2(n>=2)。{fi}称为Fibonacci数列。
    输入n,求fn mod q。其中1<=q<=30000。
    输入描述:
    第一行一个数T(1<=T<=10000)。
    以下T行,每行两个数,n,q(n<=109, 1<=q<=30000)
    输出描述:
    文件包含T行,每行对应一个答案。
    样例输入:
    3
    6 2
    7 3
    7 11
    样例输出:
    1
    0
    10
    数据范围及提示:
    1<=T<=10000
    n<=109, 1<=q<=30000
    思路:
    f(n) 是第n项的值。
    f(1)=1;f(2)=1;
    f(n)=f(n-1)+(n-2)
    这里写图片描述
    这里写图片描述
    问题的求解就变成这里写图片描述的问题,而求幂可使用快速幂。

    #include<iostream>
    using namespace std;
    int t,n,mod,ans[3][3],a[3][3];
    void mul(int s1[3][3],int s2[3][3])
    {
        int tmp[3][3]={0};
        for(int i=1;i<=2;i++)
          for(int j=1;j<=2;j++)
            for(int k=1;k<=2;k++)
            tmp[i][j]=(tmp[i][j]+s1[i][k]*s2[k][j]%mod)%mod;
        for(int i=1;i<=2;i++)
          for(int j=1;j<=2;j++)
          s1[i][j]=tmp[i][j];
    }
    void quick_power(int n)
    {
        while(n)
        {
            if(n&1)
            mul(ans,a);
            mul(a,a);
            n>>=1;
        }
    }
    int main()
    {
        cin>>t;
        while(t--)
        {
            a[1][1]=1,a[1][2]=1;
            a[2][1]=1,a[2][2]=0;
            ans[1][1]=1,ans[1][2]=1;
            ans[2][1]=1,ans[2][2]=0;
            cin>>n>>mod;
            quick_power(n-1);
            cout<<ans[1][1]%mod<<endl;
        }
    }
  • 相关阅读:
    HBase 操作
    HBase Java API 例子
    微信浏览器拖动出现黑色/白色背景、网址问题解决方案
    layui弹出层置顶弹出
    使用layui时,ajax执行后,重新渲染页面的方法
    宝塔更新
    js 播放音频文件 兼容火狐 谷歌浏览器
    SAP断点
    error_log 用法
    SE开头的事务代码
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070925.html
Copyright © 2011-2022 走看看