Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Sanchit Abrol */
- #include<bits/stdc++.h>
- using namespace std;
- #define pb push_back
- #define mp make_pair
- #define all(X) (X).begin(),(X).end()
- #define tr(c,i) for(typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
- int T,N,p[510],i,j,k;
- int ans;
- const long long MOD = 1000000007;
- long long m[510][510],y[510],x[510],b[510];
- void lup();
- long long bp(long long a, long long p);
- int main()
- {
- scanf("%d", &N);
- for(i = 0; i < N; i++)
- for(j = 0; j < N; j++)
- {
- scanf("%lld", &m[i][j]);
- if(m[i][j] < 0) m[i][j] += MOD;
- }
- lup();
- if(ans == -1) cout << "Singular\n";
- scanf("%d", &T);
- while(T--)
- {
- for(i = 0; i < N; i++)
- {
- scanf("%lld", &b[i]);
- b[i] *= -1;
- if(b[i] < 0) b[i] += MOD;
- }
- for(i = 0; i < N; i++)
- {
- y[i] = b[p[i]];
- for(j = i+1; j < N; j++)
- b[p[j]] = (b[p[j]] - (y[i] * m[j][i]) % MOD + MOD) % MOD;
- }
- for(i = N-1; i >= 0; i--)
- {
- x[i] = (y[i] * bp(m[i][i], MOD-2)) % MOD;
- for(j = N-2; j >= 0; j--)
- y[j] = (y[j] - (x[i] * m[j][i]) % MOD + MOD) % MOD;
- }
- for(i = 0; i < N; i++)
- printf("%lld ", x[i]);
- printf("\n");
- }
- return 0;
- }
- void lup()
- {
- ans = 1;
- for(i = 0; i < N; i++)
- p[i] = i;
- for(k = 0; k < N; k++)
- {
- int maxp = k;
- for(i = k+1; i < N; i++)
- if(m[i][k] > m[maxp][k])
- maxp = i;
- if(m[maxp][k] == 0){ ans = -1; return; }
- if(maxp != k)
- {
- swap(p[k], p[maxp]);
- for(i = 0; i < N; i++)
- swap(m[maxp][i], m[k][i]);
- }
- for(i = k+1; i < N; i++)
- {
- m[i][k] = (m[i][k] * bp(m[k][k], MOD-2)) % MOD;
- for(j = k+1; j < N; j++)
- m[i][j] = (m[i][j] - (m[i][k] * m[k][j]) % MOD + MOD) % MOD;
- }
- }
- }
- long long bp(long long a, long long p)
- {
- long long ans = 1;
- while(p)
- {
- if(p % 2) ans = (ans * a) % MOD;
- p /= 2;
- a = (a * a) % MOD;
- }
- return ans;
- }
Advertisement
Add Comment
Please, Sign In to add comment