提交时间:2026-02-09 19:33:22
运行 ID: 39923
#include <algorithm> #include <cstdio> #include <iostream> #include <vector> using namespace std; using u64 = unsigned long long; struct Generator { int state; Generator(u64 seed) : state(seed) { } u64 operator()() { u64 cur = state; cur ^= cur << 5; cur ^= cur >> 11; cur ^= cur << 54; return state = cur; } }; int get_len(u64 val) { int ans = 0; while (val > 0) { ++ans; val /= 10; } return max(ans, 1); } struct Number { static constexpr int BASE = 1e8, LEN = 8; Number(int x = 0) { while (x > 0) { digit.push_back(x % BASE); x /= BASE; } if (digit.empty()) digit.push_back(0); } u64& operator[](int idx) { return digit[idx]; } u64 operator[](int idx) const { return digit[idx]; } void resize(int len) { digit.resize(len); } int size() const { return digit.size(); } void pop_back() { digit.pop_back(); } u64 back() const { return digit.back(); } friend bool operator<(const Number& lhs, const Number& rhs) { if (lhs.size() < rhs.size()) return true; else if (lhs.size() > rhs.size()) return false; for (int i = lhs.size() - 1; i >= 0; --i) { if (lhs[i] < rhs[i]) return true; else if (lhs[i] > rhs[i]) return false; } return false; } friend Number operator*(const Number& lhs, const Number& rhs) { Number res; res.resize(lhs.size() + rhs.size()); for (int i = 0; i < lhs.size(); ++i) { if (lhs[i] == 0) continue; for (int j = 0; j < rhs.size(); ++j) res[i + j] += lhs[i] * rhs[j]; } for (int i = 0; i < lhs.size() + rhs.size() - 1; ++i) { if (res[i] < BASE) continue; res[i + 1] += res[i] / BASE; res[i] %= BASE; } while (res.size() > 1 && res.back() == 0) res.pop_back(); return res; } friend Number& operator*=(Number& lhs, const Number& rhs) { return lhs = lhs * rhs; } friend ostream& operator<<(ostream& os, const Number& num) { os << num.back(); for (int i = num.size() - 2; i >= 0; --i) { int len = get_len(num[i]); for (int j = len; j < LEN; ++j) os << '0'; os << num[i]; } return os; } private: vector<u64> digit; }; struct Solution { void main() { int n, v; u64 seed; cin >> n >> v >> seed; Generator gen(seed); v = 1 << (v - 1); vector<vector<int>> a(n + 1, vector<int>(n + 1)); for (int i = 1; i <= n; ++i) { for (int j = i; j <= n; ++j) a[i][j] = gen() % v + 1; } vector<Number> f(n + 1); f[0] = 1; for (int i = 1; i <= n; ++i) { Number cur = 1; for (int j = i; j > 0; --j) { cur *= a[j][j]; if (a[j][i] < cur) break; f[i] = max(f[i], f[j - 1] * a[j][i]); } } cout << f[n] << '\n'; } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int t; cin >> t; while (t-- > 0) Solution().main(); return 0; }