QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#542368 | #8940. Piggy Sort | ucup-team180# | WA | 2ms | 3832kb | C++14 | 4.7kb | 2024-09-01 00:53:53 | 2024-09-01 00:53:53 |
Judging History
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;
}
}
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3604kb
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: 3832kb
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'