#include<iostream> #include<algorithm> #include<set> usingnamespace std; multiset<longlong> S; voidgenerate_array(int n, int m, int seed) { unsigned x = seed; for (int i = 0; i < n; ++i) { x ^= x << 13; x ^= x >> 17; x ^= x << 5; S.insert(x % m + 1); } } intmain() { int n, m, seed; cin >> n >> m >> seed; generate_array(n, m, seed); while (S.size() >= 2) { longlong a = *S.begin(); S.erase(S.begin()); longlong b = *S.begin(); S.erase(S.begin()); S.insert(min(a, b) * 2); } cout << *S.begin() << endl; return0; }
#include<iostream> #include<algorithm> usingnamespace std; constint N = 10000005; constlonglong INF = 1e18; int b[N], a[N]; longlong q[N]; voidgenerate_array(int n, int m, int seed) { unsigned x = seed; for (int i = 0; i < n; ++i) { x ^= x << 13; x ^= x >> 17; x ^= x << 5; b[x % m + 1]++; } } intmain() { int n, m, seed; cin >> n >> m >> seed; generate_array(n, m, seed); int cc = 0; for (int i = 1; i <= m; i++) for (int j = 1; j <= b[i]; j++) a[++cc] = i; int l = 1, ql = 1, qr = 0; while ((n - l + 1) + (qr - ql + 1) >= 2) { longlong u = min(l <= n ? 1ll * a[l] : INF, ql <= qr ? q[ql] : INF); if (u == a[l]) l++; else ql++; longlong v = min(l <= n ? 1ll * a[l] : INF, ql <= qr ? q[ql] : INF); if (v == a[l]) l++; else ql++; q[++qr] = min(u, v) * 2; } if (l == n) cout << a[n] << endl; else cout << q[ql] << endl; return0; }