Guest User

Hyperplanes - CRANHYPL - Cranium 2015

a guest
Feb 14th, 2015
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.26 KB | None | 0 0
  1. /*  Sanchit Abrol  */
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4.  
  5. #define pb push_back
  6. #define mp make_pair
  7. #define all(X) (X).begin(),(X).end()
  8. #define tr(c,i) for(typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
  9.        
  10. int T,N,p[510],i,j,k;
  11. int ans;
  12. const long long MOD = 1000000007;
  13. long long m[510][510],y[510],x[510],b[510];
  14. void lup();
  15. long long bp(long long a, long long p);
  16.  
  17. int main()
  18. {  
  19.     scanf("%d", &N);
  20.     for(i = 0; i < N; i++)
  21.     for(j = 0; j < N; j++)
  22.     {
  23.         scanf("%lld", &m[i][j]);
  24.         if(m[i][j] < 0) m[i][j] += MOD;
  25.     }
  26.     lup();
  27.     if(ans == -1) cout << "Singular\n";
  28.     scanf("%d", &T);
  29.     while(T--)
  30.     {
  31.         for(i = 0; i < N; i++)
  32.         {
  33.             scanf("%lld", &b[i]);
  34.             b[i] *= -1;      
  35.             if(b[i] < 0) b[i] += MOD;
  36.         }
  37.         for(i = 0; i < N; i++)
  38.         {
  39.             y[i] = b[p[i]];
  40.             for(j = i+1; j < N; j++)
  41.                 b[p[j]] = (b[p[j]] - (y[i] * m[j][i]) % MOD + MOD) % MOD;
  42.         }
  43.         for(i = N-1; i >= 0; i--)
  44.         {
  45.             x[i] = (y[i] * bp(m[i][i], MOD-2)) % MOD;
  46.             for(j = N-2; j >= 0; j--)
  47.                 y[j] = (y[j] - (x[i] * m[j][i]) % MOD + MOD) % MOD;
  48.         }    
  49.         for(i = 0; i < N; i++)
  50.             printf("%lld ", x[i]);
  51.         printf("\n");
  52.     }    
  53.        
  54.    
  55.     return 0;
  56. }
  57.  
  58. void lup()
  59. {
  60.     ans = 1;
  61.     for(i = 0; i < N; i++)
  62.         p[i] = i;
  63.     for(k = 0; k < N; k++)
  64.     {
  65.         int maxp = k;
  66.         for(i = k+1; i < N; i++)
  67.             if(m[i][k] > m[maxp][k])
  68.                 maxp = i;
  69.         if(m[maxp][k] == 0){ ans = -1; return; }
  70.         if(maxp != k)
  71.         {
  72.             swap(p[k], p[maxp]);
  73.             for(i = 0; i < N; i++)
  74.                 swap(m[maxp][i], m[k][i]);                
  75.         }
  76.         for(i = k+1; i < N; i++)
  77.         {
  78.             m[i][k] = (m[i][k] * bp(m[k][k], MOD-2)) % MOD;
  79.             for(j = k+1; j < N; j++)
  80.                 m[i][j] = (m[i][j] - (m[i][k] * m[k][j]) % MOD + MOD) % MOD;
  81.         }
  82.     }
  83. }
  84.  
  85. long long bp(long long a, long long p)
  86. {
  87.     long long ans = 1;
  88.     while(p)
  89.     {
  90.         if(p % 2) ans = (ans * a) % MOD;
  91.         p /= 2;
  92.         a = (a * a) % MOD;
  93.     }
  94.     return ans;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment