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;
        }
    }
  • 相关阅读:
    windows x64 软件约定
    windows 64位 系统非HOOK方式监控进程创建
    win 64 ring0 inline hook
    win 64 Shadow ssdt hook
    win 64 SSDT HOOK
    win 64 文件操作
    win64 驱动内存基本操作
    windbg符号表问题
    Windows 64位驱动编程基础与win64 ssdt
    基础知识
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070925.html
Copyright © 2011-2022 走看看