• HDU----(4549)M斐波那契数列(小费马引理+快速矩阵幂)


    M斐波那契数列

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
    Total Submission(s): 1534    Accepted Submission(s): 435


    Problem Description
    M斐波那契数列F[n]是一种整数数列,它的定义如下:

    F[0] = a
    F[1] = b
    F[n] = F[n-1] * F[n-2] ( n > 1 )

    现在给出a, b, n,你能求出F[n]的值吗?
     
    Input
    输入包含多组测试数据;
    每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 )
     
    Output
    对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n]对1000000007取模后的值即可,每组数据输出一行。
     
    Sample Input
    01 0
    6 10 2
     
    Sample Output
    0 60
     
    Source
     
    F[n] = F[n-1] * F[n-2] ---》 F[n] = F[n-2]^2* F[n-3]^1----》F[n] = F[n-3]^3* F[n-4]^2----》
     F[n] = F[n-4]^5* F[n-5]^3  -----......--->F[n] = F[2]^a[n-1]* F[1]^a[n-2];    //我们可以的到处a[n]为一个斐波那契数列
    但是对于这样一个式子:
          F[n] = F[2]^a[n-1]* F[1]^a[n-2];  我们依旧还是不好处理哇,毕竟n<1e9这么大,这样我们不妨引用小费马引理处理....
        首先我们应该知道小费马引理的定义: 
                               形如:  (a^b)mod c = a^(b mod (c-1) ) mod c;
        这样,我们就可以找到这样一个方法来做这道题:
                      F[n] = F[2]^a[n-1]* F[1]^a[n-2];   可以写成  F[n] = (F[2]^(a[n-1]%(mod-1))* F[1]^(a[n-2]%(mod-1)))%mod;
         可以明确的是,F[2],F[1]我们事先已经知道,所以问题在于求解a[n-1],a[n-2]由于数据巨大,为了提升效率我们可以使用矩阵快速幂来求解
         对于  a[n]=a[n-1]+a[n-2]  a[0]=a[1]=1;  这样的斐波那契数列,我们应该不难构造出它的矩阵来
          |a[n]   |   =|1,1|^(n-2)  |a[n-1]|
          |a[n-1]|     |1,0|*          |a[n-2]|
    得到了 a[n],a[n-1]之后我们在使用一个快速幂求解 a^b 即可。
    代码:
     1 //#define LOCAL
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cstring>
     5 #define LL __int64
     6 using namespace std;
     7 const int mod =1000000007;
     8 
     9 LL mat[2][2];
    10 LL ans[2][2];
    11 LL n,aa,bb;
    12 
    13 void Matrix(LL a[][2],LL b[][2])
    14 {
    15     LL cc[2][2]={0};
    16     for(int i=0;i<2;i++)
    17     {
    18       for(int j=0;j<2;j++)
    19       {
    20           for(int k=0;k<2;k++)
    21         {
    22             cc[i][j]=(cc[i][j]+a[i][k]*b[k][j])%(mod-1);
    23         }
    24       }
    25     }
    26     for(int i=0;i<2;i++)
    27     {
    28       for(int j=0;j<2;j++)
    29       {
    30         a[i][j]=cc[i][j];
    31       }
    32     }
    33 }
    34 
    35 void pow(LL w)
    36 {
    37   mat[1][1]=mat[0][1]=mat[1][0]=1;
    38   mat[0][0]=0;
    39 
    40   while(w>0)
    41   {
    42     if(w&1) Matrix(ans,mat);
    43      w>>=1;
    44      if(w==0)break;
    45      Matrix(mat,mat);
    46   }
    47 }
    48 LL pow_int(LL a,LL b)
    49 {
    50     LL ans=1;
    51     while(b>0)
    52     {
    53      if(b&1){
    54          ans*=a;
    55          ans%=mod;
    56      }
    57       b>>=1;
    58       if(b==0)break;
    59       a*=a;
    60       a%=mod;
    61     }
    62    return ans;
    63 }
    64 void input(LL w)
    65 {
    66      ans[0][0]=ans[1][1]=1;
    67      ans[0][1]=ans[1][0]=0;
    68      pow(w-2);
    69      LL fn_2=(ans[0][0]+ans[0][1])%(mod-1);
    70      pow(1);
    71      LL fn_1=(ans[0][0]+ans[0][1])%(mod-1);
    72      printf("%I64d
    ",(pow_int(aa,fn_2)*pow_int(bb,fn_1))%mod);
    73 }
    74 
    75 int main()
    76 {
    77   #ifdef LOCAL
    78    freopen("test.in","r",stdin);
    79   #endif
    80   while(scanf("%I64d%I64d%I64d",&aa,&bb,&n)!=EOF)
    81      if(n==0)printf("%I64d
    ",aa);
    82      else if(n==1)printf("%I64d
    ",bb);
    83      else
    84         input(n);
    85  return 0;
    86 }
    View Code
  • 相关阅读:
    nginx 开启 gzip 压缩
    React Native 开发豆瓣评分(八)首页开发
    flutter报错--ProcessException: Process... gradlew.bat ...exited abnormally
    React Native 开发豆瓣评分(七)首页组件开发
    React Native 开发豆瓣评分(六)添加字体图标
    React Native 开发豆瓣评分(五)屏幕适配方案
    随笔
    MySQL的安装与配置
    mybatisXMLsql
    数据类型转换
  • 原文地址:https://www.cnblogs.com/gongxijun/p/3986526.html
Copyright © 2020-2023  润新知