zoukankan      html  css  js  c++  java
  • HDU 4549 矩阵快速幂+快速幂+欧拉函数

    M斐波那契数列

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


    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
    0 1 0 6 10 2
     
    Sample Output
    0 60
     
    Source
     题意:给你 a ,b,n 求f[n];
     题解:矩阵快速幂+快速幂+欧拉函数
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <algorithm>
     6 #include <stack>
     7 #include <queue>
     8 #include <cmath>
     9 #include <map>
    10 #define ll  __int64
    11 #define mod 1000000007
    12 #define dazhi 2147483647
    13 using namespace  std;
    14 ll a,b,n;
    15 struct matrix
    16 {
    17     ll m[5][5];
    18 } ans,exm;
    19 ll phi(ll nn)
    20 {
    21     ll i,rea=nn;
    22     for(i=2;i*i<=nn;i++)
    23     {
    24         if(nn%i==0)
    25         {
    26             rea=rea-rea/i;
    27             while(nn%i==0)
    28                 nn/=i;
    29          }
    30     }
    31     if(nn>1)
    32         rea=rea-rea/nn;
    33     return rea;
    34 }
    35 ll zha=phi(mod);
    36 struct matrix matrix_mulit(struct matrix aa, struct matrix bb)
    37 {
    38     struct matrix there;
    39     for(int i=0; i<2; i++)
    40     {
    41         for(int j=0; j<2; j++)
    42         {
    43             there.m[i][j]=0;
    44             for(int k=0; k<2; k++)
    45                 there.m[i][j]=(there.m[i][j]+aa.m[i][k]*bb.m[k][j]%zha)%zha;
    46         }
    47     }
    48     return there;
    49 };
    50 ll matrix_quick(ll gg)
    51 {
    52     exm.m[0][0]=exm.m[0][1]=exm.m[1][0]=1;
    53     exm.m[1][1]=0;
    54     ans.m[0][0]=ans.m[1][1]=1;
    55     ans.m[0][1]=ans.m[1][0]=0;
    56     while(gg)
    57     {
    58         if(gg&1)
    59         {
    60             ans=matrix_mulit(ans,exm);
    61         }
    62         exm=matrix_mulit(exm,exm);
    63         gg>>=1;
    64     }
    65     return ans.m[0][0];
    66 }
    67 ll quickmod(ll aa,ll bb)
    68 {
    69     ll re=1;
    70     while(bb)
    71     {
    72         if(bb&1)
    73             re=(re*aa)%mod;
    74         aa=(aa*aa)%mod;
    75         bb>>=1;
    76     }
    77     return re;
    78 }
    79 
    80 int main()
    81 {
    82     while(scanf("%I64d %I64d %I64d",&a,&b,&n)!=EOF)
    83     {
    84         if(n==0)
    85             printf("%I64d
    ",a);
    86         else
    87         {
    88             if(n==1)
    89                 printf("%I64d
    ",b);
    90             else
    91             {
    92                 printf("%I64d
    ",quickmod(a,matrix_quick(n-2)+zha)*quickmod(b,matrix_quick(n-1)+zha)%mod);
    93             }
    94         }
    95     }
    96     return 0;
    97 }
  • 相关阅读:
    Struts2中There is no Action mapped for namespace错误解决方法
    String字符串常量池简介
    main方法中参数"String[ ] args"详解
    自定义异常基本用法
    finally关键字执行的底层原理
    Linux环境下安装mysql5.6(二进制包不是rpm格式)
    finalize关键字小结
    "=="和equals小结
    super关键字小结(构造方法的执行是不是一定会创建对象?)
    冒泡排序
  • 原文地址:https://www.cnblogs.com/hsd-/p/6421559.html
Copyright © 2011-2022 走看看