hdu 4549 矩阵快速幂

题意:

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

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

现在给出a, b, n,你能求出F[n]的值吗?

链接:点我

这题的话,看a ,b 的指数,刚好可以使用斐波那契数列求解。
 
然后用矩阵做。
 
A^B %C   这题的C是质素,而且A,C是互质的。
所以直接A^(B%(C-1)) %C
 1 #include<cstdio>

 2 #include<iostream>

 3 #include<algorithm>

 4 #include<cstring>

 5 #include<cmath>

 6 #include<queue>

 7 #include<map>

 8 using namespace std;

 9 #define MOD 1000000007

10 #define pb(a) push_back(a)

11 const int INF=0x3f3f3f3f;

12 const double eps=1e-5;

13 typedef long long ll;

14 #define cl(a) memset(a,0,sizeof(a))

15 #define ts printf("*****\n");

16 const int MAXN=30010;

17 int n,m,tt,cnt;

18 struct Matrix

19 {

20     long long mat[2][2];

21 };

22 Matrix mul(Matrix a,Matrix b)

23 {

24     Matrix ret;

25     for(int i=0;i<2;i++)

26         for(int j=0;j<2;j++)

27         {

28             ret.mat[i][j]=0;

29             for(int k=0;k<2;k++)

30             {

31                 ret.mat[i][j]+=a.mat[i][k]*b.mat[k][j];

32                 ret.mat[i][j]%=(MOD-1);

33             }

34         }

35     return ret;

36 }

37 Matrix pow_M(Matrix a,int n)

38 {

39     Matrix ret;

40     memset(ret.mat,0,sizeof(ret.mat));

41     ret.mat[0][0]=ret.mat[1][1]=1;

42     Matrix temp=a;

43     while(n)

44     {

45         if(n&1)ret=mul(ret,temp);

46         temp=mul(temp,temp);

47         n>>=1;

48     }

49     return ret;

50 }

51 long long pow_m(long long a,long long n)

52 {

53     long long ret=1;

54     long long temp=a%MOD;

55     while(n)

56     {

57         if(n&1)

58         {

59             ret*=temp;

60             ret%=MOD;

61         }

62         temp*=temp;

63         temp%=MOD;

64         n>>=1;

65     }

66     return ret;

67 }

68 int main()

69 {

70     int i,j,k;

71     #ifndef ONLINE_JUDGE

72     freopen("1.in","r",stdin);

73     #endif

74     int a,b;

75     Matrix aa;

76     aa.mat[0][0]=0;

77     aa.mat[0][1]=aa.mat[1][0]=aa.mat[1][1]=1;

78     while(~scanf("%d%d%d",&a,&b,&n))

79     {

80         Matrix bb=pow_M(aa,n);

81         int ans=(pow_m(a,bb.mat[0][0])*pow_m(b,bb.mat[1][0]))%MOD;

82         printf("%d\n",ans);

83     }

84 }

 

你可能感兴趣的:(HDU)