QOJ.ac

QOJ

ID提交记录ID题目HackerOwner结果提交时间测评时间
#1558#895132#9685. nim 游戏MilmonSurvivor_winnerFailed.2025-02-12 09:12:312025-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_winner100 ✓986ms183272kbC++145.2kb2025-02-12 08:48:362025-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