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;
        }
    }
  • 相关阅读:
    transient关键字
    java 序列化,反序列化工具
    switch case语法
    java空map定义
    斐波那契数列的实现算法
    正则表达式
    java业务逻辑代码中需要增加一些与主流业务无关操作
    阿里巴巴开发手册对manager层的定义
    july 19
    bulletproof monk quote
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070925.html
Copyright © 2011-2022 走看看