Advertisement
agul

20130412

Dec 3rd, 2013
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.16 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef long long ll;
  5.  
  6. void swap(ll * a, ll * b) {
  7.     ll t = *a;
  8.     *a = *b;
  9.     *b = t;
  10. }
  11.  
  12. int n, sel;
  13. ll ** a, * ans, cm, kk, qq;
  14.  
  15. int main(void) {
  16.     scanf("%d", &n);
  17.     a = (ll **)malloc(n * sizeof(ll *));
  18.     for (int i = 0; i < n; ++i)
  19.         a[i] = (ll *)malloc((n + 1) * sizeof(ll));
  20.     ans = (ll *)malloc(n * sizeof(ll));
  21.     for (int i = 0; i < n; ++i)
  22.         for (int j = 0; j <= n; ++j)
  23.             scanf(LLD, &a[i][j]);
  24.     for (int i = 0; i < n; ++i) {
  25.         sel = i;
  26.         for (int j = i + 1; j < n; ++j)
  27.             if (a[j][i] && (abs(a[j][i]) < abs(a[sel][i]) || !a[sel][i])) sel = j;
  28.         for (int j = 0; j <= n; ++j)
  29.             swap(&a[i][j], &a[sel][j]);
  30.         for (int j = i + 1; j < n; ++j) {
  31.             if (!a[j][i]) continue;
  32.             cm = gcd(a[i][i], a[j][i]);
  33.             kk = a[j][i] / cm;
  34.             qq = a[i][i] / cm;
  35.             for (int k = 0; k <= n; ++k)
  36.                 a[j][k] = a[j][k] * qq - a[i][k] * kk;
  37.         }
  38.     }
  39.     for (int i = n - 1; i >= 0; --i) {
  40.         for (int j = i + 1; j < n; ++j)
  41.             a[i][n] -= a[i][j] * ans[j];
  42.         ans[i] = a[i][n] / a[i][i];
  43.     }
  44.     for (int i = 0; i < n; ++i)
  45.         printf("%lld\n", ans[i]);
  46.     for (int i = 0; i < n; ++i)
  47.         free(a[i]);
  48.     free(a);
  49.     free(ans);
  50.     return 0;
  51. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement