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 }

 

posted @ 2015-06-14 10:49  miao_a_miao  阅读(163)  评论(0编辑  收藏  举报