Kaidul

10229

Nov 24th, 2013
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.46 KB | None | 0 0
  1. #include <cstdio>
  2. #include <vector>
  3. #define FOR(i, n) for (int i = 1; i <= n; i++)
  4. using namespace std;
  5.  
  6. typedef long long int64;
  7. typedef vector< vector<int64> > matrix;
  8.  
  9. int MOD;
  10. #define K 2
  11.  
  12. // computes A * B
  13. matrix multiply(matrix A, matrix B) {
  14.     matrix C(K + 1, vector <int64> (K + 1));
  15.     FOR(i, K) {
  16.         FOR(j, K) {
  17.             FOR(k, K) {
  18.                 C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % MOD;
  19.             }
  20.         }
  21.     }
  22.     return C;
  23. }
  24.  
  25. // computes A ^ p
  26. matrix pow(matrix A, int p) {
  27.     if (p == 1)
  28.         return A;
  29.     if (p % 2)
  30.         return multiply(A, pow(A, p - 1));
  31.     matrix X = pow(A, p / 2);
  32.     return multiply(X, X);
  33. }
  34.  
  35. // returns the N-th term of Fibonacci sequence
  36. int64 fib(int N) {
  37.     // create vector F1
  38.     vector <int64> F1(K + 1);
  39.     F1[1] = 1;
  40.     F1[2] = 1;
  41.  
  42.     // create matrix T
  43.     matrix T( K + 1, vector <int64> (K + 1) );
  44.     T[1][1] = 0, T[1][2] = 1;
  45.     T[2][1] = 1, T[2][2] = 1;
  46.  
  47.     // raise T to the (N-1)th power
  48.     if (N == 1)
  49.         return 1;
  50.     T = pow(T, N - 1);
  51.  
  52.     // the answer is the first row of T . F1
  53.     int64 ans = 0;
  54.     FOR(i, K) {
  55.         ans = (ans + T[1][i] * F1[i]) % MOD;
  56.     }
  57.     return ans;
  58. }
  59. // Runtime Error :/
  60. int main(void) {
  61. #ifndef ONLINE_JUDGE
  62.     freopen("input.txt", "r", stdin);
  63. #endif
  64.     int n, m;
  65.     while ( scanf("%d %d", &n, &m) == 2 ) {
  66.         MOD = (1 << m);
  67.         printf("%lld\n", fib(n) );
  68.     }
  69.     return 0;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment