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;
        }
    }
  • 相关阅读:
    redis环境搭建笔记
    mysql主从配置
    虚拟机下的hadoop集群环境搭建。
    maven 集成spring
    maven 集成spring ,mybatis
    andorid一个简单的短信发送程序
    android 一个简单的拨打电话程序
    hibernate 多对多双向关联
    hibernate 多对多注解配置
    hibernat 多对一注解配置
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070925.html
Copyright © 2011-2022 走看看