QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#542384#8940. Piggy Sortucup-team180#WA 2ms3616kbC++144.7kb2024-09-01 01:00:102024-09-01 01:00:11

Judging History

你现在查看的是最新测评结果

  • [2024-09-01 01:00:11]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:3616kb
  • [2024-09-01 01:00:10]
  • 提交

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);
}
long long gcd(long long a, long long b){
  if (b == 0){
    return a;
  } else {
    return gcd(b, a % b);
  }
}
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

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3616kb

input:

3
2 4
1 2
3 4
5 6
7 8
1 2
1
1
3 4
1 2 3
6 9 9
10 15 17
12 18 21

output:

1 2
1
3 1 2

result:

ok 3 lines

Test #2:

score: -100
Wrong Answer
time: 2ms
memory: 3612kb

input:

41
1 2
-19
9531
2 3
11 13
3175 4759
2211 3313
10 19
-54 -25 -19 -18 -1 3 61 63 85 88
-54 753 863 2397 3111 4649 4671 4756 5507 7762
-54 369 479 1245 1575 2345 2367 2452 2819 3922
-54 553 663 1797 2311 3449 3471 3556 4107 5762
-54 87 197 399 447 653 675 760 845 1102
-54 320 430 1098 1379 2051 2073 21...

output:

1
1 2
1 2 6 10 5 7 9 4 3 8
8 7 5 9 2 1 6 3 4
1 6 5 9 8 2 3 10 4 7
7 3 1 4 5 8 2 6 9 10
4 3 1 8 2 5 6 7
3 1 5 2 6 9 8 7 4 10
2 3 1 4
7 8 1 9 5 2 3 6 4
1 5 2 6 7 3 4 8 9
2 3 5 4 9 7 8 6 1
1 2 4 8 5 7 10 6 9 3
7 1 3 2 9 8 10 4 5 6
3 2 7 8 5 4 9 1 6
8 1 2 7 6 9 3 5 4
3 10 8 6 7 1 2 9 5 4
6 4 1 8 7 9 10 ...

result:

wrong answer 6th lines differ - expected: '3 5 10 6 7 4 9 8 2 1', found: '7 3 1 4 5 8 2 6 9 10'