結果
| 問題 | No.3673 未来予知 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-08-27 13:46:45 |
| 言語 | C++23 (gcc 15.3.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 3 ms / 200 ms |
| + 335µs | |
| コード長 | 1,837 bytes |
| 記録 | |
| コンパイル時間 | 2,115 ms |
| コンパイル使用メモリ | 350,456 KB |
| 実行使用メモリ | 9,772 KB |
| 最終ジャッジ日時 | 2026-09-04 22:55:46 |
| 合計ジャッジ時間 | 4,508 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge1_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 32 |
ソースコード
#include <bits/stdc++.h>
#include <atcoder/modint>
using namespace std;
using namespace atcoder;
using mint = static_modint<2>;
template<typename T>
pair<bool, vector<T>> solve_linear(vector<vector<T>> A, vector<T> b) {
assert(!A.empty());
int N = A.size(), M = A[0].size(), rk = 0;
assert(b.size() == N);
vector<int> C;
for (int i = 0; i < M; i++) {
int j = rk;
while (j < N && !A[j][i].val()) j++;
if (j == N) continue;
swap(A[rk], A[j]);
swap(b[rk], b[j]);
C.emplace_back(i);
T a = 1 / A[rk][i];
b[rk] *= a;
for (auto&x : A[rk]) x *= a;
for (j = 0; j < N; j++) if (j != rk) {
T a = A[j][i];
b[j] -= a * b[rk];
for (int k = 0; k < M; k++) A[j][k] -= a * A[rk][k];
}
rk++;
}
for (int i = rk; i < N; i++) if(b[i].val()) {
return make_pair(false, vector<T>(0));
}
vector<T> ans(M);
for (int i = 0; i < rk; i++) ans[C[i]] = b[i];
return make_pair(true, ans);
}
int main() {
string T;
cin >> T;
int N;
cin >> N;
vector<vector<mint>> A(200, vector<mint>(32));
for (int i = 0; i < 32; i++) {
unsigned x = unsigned(1) << i;
for (int j = 0; j < 100; j++) {
x ^= x << 13;
x ^= x >> 17;
x ^= x << 5;
A[2 * j][i] = x & 1;
A[2 * j + 1][i] = (x >> 1) & 1;
}
}
vector<mint> b(200);
for (int i = 0; i < 100; i++) {
if (T[i] == 'S' || T[i] == 'X') b[2 * i] = 1;
if (T[i] == 'P' || T[i] == 'X') b[2 * i + 1] = 1;
}
auto [res, _x] = solve_linear(A, b);
assert(res);
unsigned x = 0;
for (int i = 0; i < 32; i++) if(_x[i].val()) x |= unsigned(1) << i;
for (int i = 0; i < 100; i++) {
x ^= x << 13;
x ^= x >> 17;
x ^= x << 5;
}
for (int i = 0; i < N; i++) {
x ^= x << 13;
x ^= x >> 17;
x ^= x << 5;
cout << "XRSP"[x&3];
}
cout << endl;
return 0;
}