Advertisement
LucasLima

Recurrences - UVa 10870

Oct 18th, 2012
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.32 KB | None | 0 0
  1. //The Beauty of Linear Algebra
  2.  
  3. #include <cstdio>
  4. #include <cstring>
  5. #define MAX_N 15
  6.  
  7. typedef unsigned long long ll;
  8.  
  9. struct Matrix { ll mat[MAX_N][MAX_N]; };
  10.  
  11. Matrix matMult(const Matrix& a, const Matrix& b, ll d, ll mod) {
  12.     Matrix ans; ll k;
  13.     for(int i = 0; i < d; ++i)
  14.         for(int j = 0; j < d; ++j)
  15.             for(ans.mat[i][j] = k = 0; k < d; ans.mat[i][j]%=mod,++k)
  16.                 ans.mat[i][j]+=((a.mat[i][k]%mod)*(b.mat[k][j]%mod))%mod;
  17.                
  18.     return ans;
  19. }
  20.  
  21. Matrix fastExp(Matrix base, ll p, ll d,ll mod) {
  22.     Matrix ans;
  23.     for(int i = 0; i < d; ++i)
  24.         for(int j = 0; j < d; ++j)
  25.             ans.mat[i][j] = (i == j);
  26.            
  27.     while(p) {
  28.         if(p & 1) ans = matMult(ans,base,d,mod);
  29.         base = matMult(base,base,d,mod);
  30.         p >>= 1;
  31.     }
  32.     return ans;
  33. }
  34.  
  35. ll F[MAX_N];
  36. ll ans[MAX_N];
  37. int main () {
  38.     ll d, n,m;
  39.     while(scanf("%lld %lld %lld",&d,&n,&m) && d) {
  40.         Matrix M;
  41.         memset(M.mat,0,sizeof M.mat);
  42.         for(int i = 0; i < d; ++i) scanf("%lld",&M.mat[0][i]);
  43.         for(int i = 1; i < d; ++i)  M.mat[i][i-1] = 1;
  44.         for(int i = d-1; i >= 0; --i) scanf("%lld",&F[i]);
  45.         if(n > d) {
  46.             M = fastExp(M,n-d,d,m);
  47.             ll k;
  48.            
  49.             for(int i = 0; i < d; ++i)
  50.                 for(ans[i] = k = 0; k < d; ans[i]%= m, ++k) {
  51.                     ans[i]+=(M.mat[i][k]%m)*(F[k]%m)%m;
  52.             }
  53.             printf("%lld\n",ans[0]);
  54.         } else {
  55.             printf("%lld\n",F[d-n]);
  56.         }
  57.     }
  58.     return 0;
  59. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement