• Fib数列问题(项数很大)


    用fib(n)表示斐波那契数列的第n项,现在要求你求fib(n) mod m。fib(1)= 1, fib(2)= 1。

    输入格式

    输入2个整数n(1≤n≤1018), m(2≤m≤10000000)。

    输出格式

    输出fib(n)对m取模的值。

    样例输入1

    4 10

    样例输出1

    3

    样例输入2

    100000000 100000000

    样例输出2

    60546875

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;
     4 
     5 struct matrix
     6 {
     7     LL a[105][105];
     8 };
     9 matrix matrix_mul(matrix A, matrix B, LL mod)// 2 个矩阵相乘
    10 {
    11     matrix C;
    12     int i,j,k;
    13     for(i=0;i<=1;i++)
    14     {
    15         for(j=0;j<=1;j++)
    16         {
    17             C.a[i][j]=0;
    18             for(k=0;k<=1;k++)
    19             {
    20                 C.a[i][j]+=A.a[i][k]*B.a[k][j]%mod;
    21                 C.a[i][j]%=mod;
    22             }
    23         }
    24     }
    25     return C;
    26 }
    27 matrix unit() // 返回一个单位矩阵
    28 {
    29     matrix res;
    30     int i,j;
    31     for(i=0;i<=1;i++)
    32     {
    33         for(j=0;j<=1;j++)
    34         {
    35             if(i==j)
    36             res.a[i][j]=1;
    37             else
    38             res.a[i][j]=0;
    39         }
    40     }
    41     return res;
    42 }
    43 matrix matrix_pow(matrix A, LL n, LL mod)// 快速求矩阵 A 的 n 次方
    44 {
    45     matrix res=unit(),temp=A;
    46     for(;n;n/=2)
    47     {
    48         if(n&1)
    49         res=matrix_mul(res,temp,mod);
    50         temp=matrix_mul(temp,temp,mod);
    51     }
    52     return res;
    53 }
    54 
    55 int main()
    56 {
    57     LL n,m;
    58     scanf("%lld %lld",&n,&m);
    59     if(n<3)
    60     printf("1
    ");
    61     else
    62     {
    63         matrix A,B,C;
    64         A.a[0][0]=1; A.a[0][1]=1;
    65         A.a[1][0]=1; A.a[1][1]=0;
    66         B.a[0][0]=1; 
    67         B.a[1][0]=1; 
    68         C=matrix_mul( matrix_pow(A,n-2,m), B, m);
    69         printf("%lld
    ", C.a[0][0]);
    70     }
    71     return 0;
    72 }

    -

  • 相关阅读:
    01_15_Struts2_带参数的结果集
    Splunk_导航菜单配置
    质量管理体系框架
    测试人员和测试Leader考核维度
    作为管理者口袋里面需要有多把武器,拿来即用
    产品质量体系——如何度量产品质量?
    adb 获取平台号
    模拟定位工具gps mock
    Android 电脑投屏工具Vysor Pro介绍
    Eclipse+Maven+TestNg+ReportNg 生成测试报告
  • 原文地址:https://www.cnblogs.com/jiamian/p/12227731.html
Copyright © 2020-2023  润新知