QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#542367#8940. Piggy SortSpeed Star (Kentaro Matsushita, Ryomei Sugai)#Compile Error//C++144.6kb2024-09-01 00:53:072024-09-01 00:53:07

Judging History

This is the latest submission verdict.

  • [2024-09-01 00:53:07]
  • Judged
  • [2024-09-01 00:53:07]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;
const long long MOD = 998244353;
long long modpow(long long a, long long b){
  long long ans = 1;
  while (b > 0){
    if (b % 2 == 1){
      ans *= a;
      ans %= MOD;
    }
    a *= a;
    a %= MOD;
    b /= 2;
  }
  return ans;
}
long long modinv(long long a){
  return modpow(a, MOD - 2);
}
int main(){
  int t;
  cin >> t;
  for (int i = 0; i < t; i++){
    int n, m;
    cin >> n >> m;
    vector<vector<int>> x(m, vector<int>(n));
    for (int j = 0; j < m; j++){
      for (int k = 0; k < n; k++){
        cin >> x[j][k];
      }
    }
    vector<long long> s(m, 0);
    for (int j = 0; j < m; j++){
      for (int k = 0; k < n; k++){
        s[j] += x[j][k];
      }
    }
    long long d = 0;
    for (int j = 0; j < m - 1; j++){
      d = gcd(d, s[j + 1] - s[j]);
    }
    if (d == 0){
      for (int j = 0; j < n; j++){
        cout << j + 1;
        if (j < n - 1){
          cout << ' ';
        }
      }
      cout << endl;
    } else {
      vector<int> t(m);
      for (int j = 0; j < m; j++){
        t[j] = (s[j] - s[0]) / d;
      }
      vector<vector<long long>> psum(n + 1, vector<long long>(n + 1, 0));
      for (int j = 0; j <= n; j++){
        for (int k = 0; k < n; k++){
          long long tmp = 1;
          for (int l = 0; l <= n; l++){
            psum[j][l] += tmp;
            psum[j][l] %= MOD;
            tmp *= x[j][k];
            tmp %= MOD;
          }
        }
      }
      vector<long long> ti(m);
      for (int j = 0; j < m; j++){
        ti[j] = modinv(t[j]);
      }
      vector<vector<long long>> di(m, vector<long long>(m));
      for (int j = 0; j < m; j++){
        for (int k = 0; k < m; k++){
          if (j != k){
            di[j][k] = modinv(t[j] - t[k]);
          }
        }
      }
      vector<long long> b(n, 0);
      for (int j = 0; j < n; j++){
        vector<long long> X(j + 2), Y(j + 2);
        for (int k = 0; k < j + 2; k++){
          X[k] = t[k];
          Y[k] = psum[k][j + 1];
        }
        vector<vector<long long>> dp(j + 3, vector<long long>(j + 3, 0));
        dp[0][0] = 1;
        for (int k = 0; k < j + 2; k++){
          for (int l = 0; l <= k; l++){
            dp[k + 1][l] += dp[k][l] * (MOD - X[k]);
            dp[k + 1][l] %= MOD;
            dp[k + 1][l + 1] += dp[k][l];
            dp[k + 1][l + 1] %= MOD;
          }
        }
        for (int k = 0; k < j + 2; k++){
          long long add;
          if (X[k] == 0){
            add = dp[j + 2][2];
          } else {
            add = (dp[j + 2][1] + dp[j + 2][0] * ti[k]) % MOD * (MOD - ti[k]) % MOD;
          }
          add *= Y[k];
          add %= MOD;
          for (int l = 0; l < j + 2; l++){
            if (k != l){
              add *= di[k][l];
              add %= MOD;
            }
          }
          b[j] += add;
        }
        b[j] %= MOD;
      }
      vector<long long> inv(n + 1);
      inv[1] = 1;
      for (int j = 2; j <= n; j++){
        inv[j] = MOD - inv[MOD % j] * (MOD / j) % MOD;
      }
      for (int j = 0; j < n; j++){
        b[j] *= inv[j + 1];
        b[j] %= MOD;
      }
      vector<vector<long long>> A(n, vector<long long>(n + 1));
      for (int j = 0; j < n; j++){
        A[0][j] = 1;
        for (int k = 1; k < n; k++){
          A[k][j] = A[k - 1][j] * x[0][j] % MOD;
        }
      }
      for (int j = 0; j < n; j++){
        A[j][n] = b[j];
      }
      for (int j = 0; j < n; j++){
        if (A[j][j] == 0){
          for (int k = j + 1; k < n; k++){
            if (A[k][j] == 0){
              swap(A[j], A[k]);
              break;
            }
          }
        }
        long long tmp = modinv(A[j][j]);
        for (int k = j; k <= n; k++){
          A[j][k] *= tmp;
          A[j][k] %= MOD;
        }
        for (int k = 0; k < n; k++){
          if (k != j){
            long long a = A[k][j];
            for (int l = j; l <= n; l++){
              A[k][l] += MOD - a * A[j][l] % MOD;
              A[k][l] %= MOD;
            }
          }
        }
      }
      vector<int> v(n);
      for (int j = 0; j < n; j++){
        v[j] = A[j][n];
      }
      vector<int> p(n);
      for (int j = 0; j < n; j++){
        p[j] = j;
      }
      stable_sort(p.begin(), p.end(), [&](int j, int k){
        return v[j] < v[k];
      });
      vector<int> r(n);
      for (int j = 0; j < n; j++){
        r[p[j]] = j;
      }
      for (int j = 0; j < n; j++){
        cout << r[j] + 1;
        if (j < n - 1){
          cout << ' ';
        }
      }
      cout << endl;
    }
  }
}

Details

answer.code: In function ‘int main()’:
answer.code:40:11: error: ‘gcd’ was not declared in this scope
   40 |       d = gcd(d, s[j + 1] - s[j]);
      |           ^~~