QOJ.ac
QOJ
ID | 提交记录ID | 题目 | Hacker | Owner | 结果 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|
#1558 | #895132 | #9685. nim 游戏 | Milmon | Survivor_winner | Failed. | 2025-02-12 09:12:31 | 2025-02-12 09:12:31 |
详细
Extra Test:
Accepted
time: 2146ms
memory: 53228kb
input:
0 20000 9 1 26510413896079040 826387710549423913 183748994096197472 182789117320252127 443507795431997033 1056457310819717799 761812084055563894 970976561143813902 308945758442578570 11 1 96910943291494626 123932609116706688 708666623830213037 263785067983984334 833472488332243932 301259877753914598...
output:
1038 1 6 2 4 5 6 7 8 727 33 1 25 10 242 190 1 4 1 6 10 11 30 154 1 5 1038 1 6 2 4 5 6 7 8 727 33 1 25 10 242 190 1 4 1 6 10 11 30 154 1 5 1038 1 6 2 4 5 6 7 8 727 33 1 25 10 242 190 1 4 1 6 10 11 30 154 1 5 1038 1 6 2 4 5 6 7 8 727 33 1 25 10 242 190 1 4 1 6 10 11 30 154 1 5 1038 1 6...
result:
ok correct answer
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#895132 | #9685. nim 游戏 | Survivor_winner | 100 ✓ | 986ms | 183272kb | C++14 | 5.2kb | 2025-02-12 08:48:36 | 2025-02-12 08:59:50 |
answer
// superyijin AK IOI
// wangsiyuanZP AK IOI
// #pragma GCC optimize(2)
// #pragma GCC optimize(3)
#include <bits/stdc++.h>
#define int long long
#define ll long long
#define ull unsigned long long
#define i128 __int128
#define ld long double
#define pii pair<int, int>
#define vi vector<int>
#define vpii vector<pair<int, int>>
#define pb push_back
#define m_p make_pair
#define fi first
#define se second
#define pcnt __builtin_popcountll
using namespace std;
const int inf = (sizeof(int) == 4 ? 0x3f3f3f3f : 0x3f3f3f3f3f3f3f3f);
int mod = 998244353;
const ld eps = 1e-7;
void chkmin(int &x, int y) { x = min(x, y); }
void chkmax(int &x, int y) { x = max(x, y); }
void inc(int &x, int y) { x = (x + y >= mod ? x + y - mod : x + y); }
void dec(int &x, int y) { x = (x - y < 0 ? x - y + mod : x - y); }
int ksm(int a, int b)
{
int t = 1;
while (b)
{
if (b & 1) t = t * a % mod;
a = a * a % mod, b >>= 1;
}
return t;
}
int ksm(int a, int b, int p)
{
int t = 1;
while (b)
{
if (b & 1) t = t * a % p;
a = a * a % p, b >>= 1;
}
return t;
}
bool Mbe;
const int N = 3e5 + 10;
struct Bit
{
int t[N];
Bit() { memset(t, 0, sizeof(t)); }
int lowbit(int x) { return x & -x; }
void add(int x, int y) { while (x < N) t[x] += y, x += lowbit(x); }
int sum(int x)
{
int ans = 0;
while (x >= 1) ans += t[x], x -= lowbit(x);
return ans;
}
};
int fac[N], invfac[N];
void init(int n)
{
fac[0] = 1;
for (int i = 1; i <= n; i++) fac[i] = fac[i - 1] * i % mod;
invfac[n] = ksm(fac[n], mod - 2);
for (int i = n - 1; i >= 0; i--) invfac[i] = invfac[i + 1] * (i + 1) % mod;
}
int A(int n, int m)
{
if (m < 0 || m > n) return 0;
return fac[n] * invfac[n - m] % mod;
}
int C(int n, int m)
{
if (m < 0 || m > n) return 0;
return fac[n] * invfac[m] % mod * invfac[n - m] % mod;
}
int n, m, ans, id[70][100010];
vpii v[70];
vector<vpii> V;
int check(int now, vpii vec)
{
int sum = 0;
while (now)
{
int x = __lg(now);
vector<bool> f(min((int)v[x].size(), 65ll));
for (auto i : vec) if (id[x][i.fi] < 65) f[id[x][i.fi]] = true;
bool flag = false;
for (int i = 0; i < v[x].size() && i < 65; i++)
{
if (f[i]) continue;
now ^= (1ll << x) ^ v[x][i].fi, sum += (1ll << x) - v[x][i].fi;
vec.pb({v[x][i].se, (1ll << x) - v[x][i].fi});
flag = true;
break;
}
if (!flag)
{
if (vec.empty()) return inf;
now ^= (1ll << x), sum += (1ll << x);
}
}
return sum;
}
void solve(int now, int sum, vpii vec)
{
if (V.size() == m) return;
if (check(now, vec) + sum > ans) return;
if (now == 0)
{
V.pb(vec);
return;
}
int x = __lg(now);
vi vid;
for (auto i : vec) vid.pb(id[x][i.fi]);
sort(vid.begin(), vid.end());
int pp = 0;
for (int i = 0; i < v[x].size(); i++)
{
if (pp < vid.size() && vid[pp] == i)
{
pp++;
continue;
}
int w = now ^ (1ll << x) ^ v[x][i].fi, ws = sum + (1ll << x) - v[x][i].fi, last = V.size();
vec.pb({v[x][i].se, (1ll << x) - v[x][i].fi});
solve(w, ws, vec);
vec.pop_back();
if (V.size() == m || V.size() == last) return;
}
for (int i = 0; i < vec.size(); i++)
{
int w = now ^ (1ll << x), ws = sum + (1ll << x);
vec[i].se += (1ll << x);
solve(w, ws, vec);
vec[i].se -= (1ll << x);
if (V.size() == m) return;
}
}
int a[100010];
void Main(int c)
{
V.clear();
cin >> n >> m;
int now = 0;
vi vec;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
now ^= a[i];
vec.pb(a[i]);
}
for (int x = 60; x >= 0; x--)
{
v[x].clear();
for (int i = 1; i <= n; i++) id[x][i] = inf;
for (int i = 1; i <= n; i++) if (!((a[i] >> x) & 1)) v[x].pb({a[i] & ((1ll << x) - 1), i});
sort(v[x].begin(), v[x].end());
reverse(v[x].begin(), v[x].end());
for (int i = 0; i < v[x].size(); i++) id[x][v[x][i].se] = i;
}
ans = check(now, {});
if (ans == inf)
{
int p = __lg(now);
for (int x = 60; x > p; x--)
{
if (v[x].size() < 2) continue;
int w = now ^ v[x][0].fi ^ v[x][1].fi, ws = (1ll << x + 1) - v[x][0].fi - v[x][1].fi;
ans = min(ans, ws + check(w, {{v[x][0].se, (1ll << x) - v[x][0].fi}, {v[x][1].se, (1ll << x) - v[x][1].fi}}));
}
for (int x = 60; x > p; x--)
{
if (v[x].size() < 2) continue;
for (int i = 0; i < v[x].size(); i++)
{
int last1 = V.size();
for (int j = i + 1; j < v[x].size(); j++)
{
int w = now ^ v[x][i].fi ^ v[x][j].fi, ws = (1ll << x + 1) - v[x][i].fi - v[x][j].fi, last2 = V.size();
solve(w, ws, {{v[x][i].se, (1ll << x) - v[x][i].fi}, {v[x][j].se, (1ll << x) - v[x][j].fi}});
if (V.size() == m || V.size() == last2) break;
}
if (V.size() == m || V.size() == last1) break;
}
if (V.size() == m) break;
}
}
else solve(now, 0, {});
cout << ans << '\n';
cout << V.size() << '\n';
for (auto v : V)
{
sort(v.begin(), v.end());
cout << v.size() << '\n';
for (auto i : v) cout << i.fi << " ";
cout << '\n';
for (auto i : v) cout << i.se << " ";
cout << '\n';
}
}
bool Med;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cerr << (&Mbe - &Med) / 1048576.0 << "MB" << endl;
int c, T;
cin >> c >> T;
while (T--) Main(c);
return 0;
}
// superyijin AK IOI
// wangsiyuanZP AK IOI