Saturday, January 26, 2019

[UVa] 13298 - Fibonacci Family Formula

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : 13298 - Fibonacci Family Formula
Source            : UVA Online Judge
Category          : Linear Algebra
Algorithm         : Matrix Exponentiation
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. #define ll         long long int  
  6. #define mod        1000000009  
  7.   
  8. static const int maxn = 100 + 2;  
  9.   
  10. struct Mat  
  11. {  
  12.       int row, column;  
  13.       ll v[maxn][maxn];  
  14. };  
  15.   
  16. inline Mat multiply(const Mat &A, const Mat &B)  
  17. {  
  18.       Mat ret;  
  19.       ret.row = A.row;  
  20.       ret.column = B.column;  
  21.       for (int i = 0; i < A.row; i++)  
  22.       {  
  23.             for (int j = 0; j < B.column; j++)  
  24.             {  
  25.                   ll sum = 0;  
  26.                   for (int k = 0; k < A.column; k++)  
  27.                   {  
  28.                         sum += (A.v[i][k] * B.v[k][j]) % mod;  
  29.                         sum %= mod;  
  30.                   }  
  31.                   ret.v[i][j] = sum;  
  32.             }  
  33.       }  
  34.       return ret;  
  35. }  
  36.   
  37. inline Mat modPow(Mat mat, ll p)  
  38. {  
  39.       if (p == 1) return mat;  
  40.       if (p & 1) return multiply(mat, modPow(mat, p-1));  
  41.       Mat ret = modPow(mat, p >> 1);  
  42.       return multiply(ret, ret);  
  43. }  
  44.   
  45. ll arr[maxn];  
  46.   
  47. inline void Array(int k)  
  48. {  
  49.       arr[0] = 1;  
  50.       for (int i = 1; i < maxn; i++)  
  51.       {  
  52.             int temp = k;  
  53.             arr[i] = 0;  
  54.             for (int j = i-1; j >= 0 && temp; j--)  
  55.             {  
  56.                   arr[i] = (arr[i] + arr[j]) % mod;  
  57.                   --temp;  
  58.             }  
  59.       }  
  60. }  
  61.   
  62. int main()  
  63. {  
  64.       // freopen("in.txt", "r", stdin);  
  65.       int k;  
  66.       ll n;  
  67.       while (scanf("%d %lld", &k, &n) == 2)  
  68.       {  
  69.             if (k == 0 && n == 0) break;  
  70.             Mat mat;  
  71.             mat.row = k;  
  72.             mat.column = k;  
  73.             Array(k);  
  74.             for (int i = 0; i < k; i++)  
  75.             {  
  76.                   for (int j = 0; j < k; j++)  
  77.                   {  
  78.                         mat.v[i][j] = 0;  
  79.                         if (i == 0) mat.v[i][j] = 1;  
  80.                         else if (i == j + 1) mat.v[i][j] = 1;  
  81.                   }  
  82.             }  
  83.             if (n <= k)  
  84.             {  
  85.                   printf("%lld\n", arr[n]);  
  86.             }  
  87.             else  
  88.             {  
  89.                   mat = modPow(mat, n-k+1);  
  90.                   ll sum = 0;  
  91.                   for (int i = 0; i < k; i++)  
  92.                   {  
  93.                         sum += (mat.v[0][i] * arr[k-1-i]) % mod;  
  94.                         sum %= mod;  
  95.                   }  
  96.                   printf("%lld\n", sum);  
  97.             }  
  98.       }  
  99. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.