题目1081:递推数列

题目描述:

给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q。这里n >= 2。 求第k个数对10000的模。

输入:

输入包括5个整数:a0、a1、p、q、k。

输出:

第k个数a(k)对10000的模。

样例输入:
20 1 1 14 5
样例输出:
8359
 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstring>
 4  
 5  
 6 using namespace std;
 7  
 8 const int  MOD = 10000;
 9  
10  
11 /*
12 A(k)     = (p q)^(k-1)  *a1  
13 A(k-1)   = (1 0)        *a0
14 */
15  
16  
17 inline void MatrixMul( int m[][2], int n[][2] ) 
18 {
19     int s[2][2];
20     memset(s,0,sizeof(s));
21  
22     int i;
23     int j;
24     int k;
25  
26     for(i = 0; i < 2; i++)
27         for(j = 0; j < 2; j++)
28             for( k = 0; k < 2; k++)
29                 s[i][j] += m[i][k]*n[k][j];
30  
31     for(i = 0; i < 2; i++)
32         for(j = 0; j < 2; j++)
33             m[i][j] = s[i][j]%MOD;
34  
35 }
36  
37  
38 void MatrixN ( int m[][2], int n )
39 {
40     int t[2][2]={{m[0][0],m[0][1]},{m[1][0],m[1][1]}};
41  
42     if (n == 1) 
43         return;
44     else if ( n%2 == 0) 
45     { 
46         MatrixN(m,n/2); 
47         MatrixMul(m,m); 
48     }
49     else
50     { 
51         MatrixN(m,n-1); 
52         MatrixMul(m,t);
53     }
54 }
55  
56 int main(void)
57 {
58     int a;
59     int a0;
60     int a1;
61     int p;
62     int q;
63     int k;
64  
65     int m[2][2];
66  
67     while (cin >> a0 >>a1 >> p >> q >> k )
68     {
69         if (k == 0) 
70             a = a0;
71         else
72             if (k == 1)
73                 a = a1;
74             else
75            {
76                 m[0][0] = p%MOD; 
77                 m[0][1] = q%MOD;
78                 m[1][0] = 1; 
79                 m[1][1] = 0;
80  
81                 MatrixN(m,k-1);
82  
83                 a = m[0][0] * a1 + m[0][1] * a0;
84            }
85         cout<<a%MOD<<endl;
86     }
87     return 0;
88 }

 

posted @ 2013-12-09 20:28  chchche  阅读(308)  评论(0编辑  收藏  举报