QOJ.ac

QOJ

ID提交记录ID题目HackerOwner结果提交时间测评时间
#1557#894932#9685. nim 游戏Milmonb6e0Success!2025-02-12 08:55:472025-02-12 08:55:47

詳細信息

Extra Test:

Time Limit Exceeded

input:

0 2
99999 10000
946593850698207734 362633576621801186 649098826533147567 953146837814631703 532397504419042679 1114077722078496151 1116694137703929443 152423996133094846 843000353189800498 867748214099081802 818498086434512138 115216049424661858 543670360049569811 450451648597050647 2550071643981836...

output:


result:


ID题目提交者结果用时内存语言文件大小提交时间测评时间
#894932#9685. nim 游戏b6e097 664ms47960kbC++146.3kb2025-02-11 22:57:312025-02-12 08:59:24

answer

#include<bits/stdc++.h>
using namespace std;
namespace fastio
{
	constexpr int S1=1<<20;
	char buf1[S1],*l1,*r1;
	inline char getc()
	{
		return ((l1==r1&&(r1=(l1=buf1)+fread(buf1,1,S1,stdin)),l1!=r1)?*l1++:EOF);
	}
	template<typename T=int>inline T read()
	{
		T x=0,y=1;
		char c=getc();
		while(c<'0'||c>'9')
		{
			if(c=='-')
				y=-1;
			c=getc();
		}
		while(c>='0'&&c<='9')
		{
			x=c-'0'+x*10;
			c=getc();
		}
		return x*y;
	}
	inline double readdb()
	{
		double x=0,y=1;
		char c=getc();
		while(c<'0'||c>'9')
		{
			if(c=='-')
				y=-1;
			c=getc();
		}
		while(c>='0'&&c<='9')
		{
			x=x*10+c-'0';
			c=getc();
		}
		if(c=='.')
		{
			double r=.1;
			for(c=getc();c>='0'&&c<='9';c=getc())
			{
				x+=r*(c-'0');
				r*=.1;
			}
		}
		return x*y;
	}
	inline int readstr(char*a)
	{
		int n=1;
		for(*a=getc();isspace(*a);*a=getc());
		for(*(++a)=getc();!isspace(*a);*(++a)=getc())
			n++;
		*a=0;
		return n;
	}
	constexpr int S2=1<<20;
	char buf2[S2],*l2=buf2;
	inline void putc(char c)
	{
		l2==buf2+S2&&(fwrite(buf2,1,S2,stdout),l2=buf2),*l2++=c;
	}
	int _st[22];
	template<typename T>inline void write(T x,char end='\n')
	{
		if(x<0)
			putc('-'),x=-x;
		int tp=0;
		do
			_st[++tp]=x%10;
		while(x/=10);
		while(tp)
			putc(_st[tp--]+'0');
		if(end)
			putc(end);
	}
	constexpr int DIGIT=3;
	constexpr long long _p=pow(10,DIGIT);
	inline void write_db(double y,char end='\n')
	{
		if(y<0)
			putc('-'),y=-y;
		long long x=round(y*_p);
		write(x/_p),putc('.');
		x%=_p;
		for(int i=1;i<=DIGIT;i++)
			_st[i]=x%10,x/=10;
		for(int i=DIGIT;i;i--)
			putc(_st[i]+'0');
		if(end)
			putc(end);
	}
	inline void ps(const char*s,char end='\n')
	{
		for(auto p=s;*p;p++)
			putc(*p);
		if(end)
			putc(end);
	}
	struct end
	{
		~end()
		{
			fwrite(buf2,1,l2-buf2,stdout);
		}
	}ender;
}
using fastio::getc;
using fastio::read;
using fastio::readdb;
using fastio::readstr;
using fastio::putc;
using fastio::write;
using fastio::write_db;
using fastio::ps;
constexpr __int128 INF=(__int128)(1ll<<61)*(1ll<<61);
constexpr int MN=100005,MM=20005,MW=65;
int n,m,tot[MW],t1[MW],ch[MW],tch[MN],len[MW],pe[MW][MN],p0[MN];
bool va[MW];
vector<long long>a,b,b0;
long long w[MN];
__int128 sum,res[MW],ans;
struct myvec
{
	int cnt,a[MM][MW];
	long long b[MM][MW];
	void clear()
	{
		cnt=0;
	}
	void push(vector<pair<int,long long>>v)
	{
		sort(v.begin(),v.end());
		cnt++;
		a[cnt][0]=v.size();
		for(int i=0;i<v.size();i++)
			a[cnt][i+1]=v[i].first+1,b[cnt][i+1]=v[i].second;
	}
	void output()
	{
		write(cnt);
		for(int i=1;i<=cnt;i++)
		{
			write(a[i][0]);
			for(int j=1;j<=a[i][0];j++)
				write(a[i][j],' ');
			putc('\n');
			for(int j=1;j<=a[i][0];j++)
				write(b[i][j],' ');
			putc('\n');
		}
	}
}V;
inline bool cmp(int x,int y)
{
	return w[x]>w[y];
}
inline __int128 calck(vector<long long>a)
{
	__int128 ans=0;
	for(int j=60;~j;j--)
	{
		int t=0;
		for(int i=0;i<n;i++)
			t+=((a[i]>>j)&1);
		if(~t&1)
		{
			ans+=(__int128)(1ll<<j)*t;
			tot[j]=t;
			continue;
		}
		ans+=(__int128)(1ll<<j)*(t+1);
		tot[j]=t+1;
		long long mx=-1;
		int p=0;
		for(int i=0;i<n;i++)
			if(~(a[i]>>j)&1)
			{
				long long b=a[i]&((1ll<<j)-1);
				if(b>mx)
					mx=b,p=i;
			}
		a[p]=0;
	}
	return ans;
}
inline void addch(int i)
{
	ch[++*ch]=i;
	tch[i]++;
	va[*ch]=1;
	for(int j=1;j<*ch;j++)
		if(ch[j]==i)
		{
			va[*ch]=0;
			break;
		}
}
inline void popch()
{
	tch[ch[*ch]]--;
	--*ch;
}
void dfs(int w)
{
	if(w<0)
	{
		vector<pair<int,long long>>v;
		for(int i=1;i<=*ch;i++)
			if(va[i])
				v.emplace_back(ch[i],b[ch[i]]-a[ch[i]]);
		V.push(v);
		m--;
		return;
	}
	int t=t1[w];
	for(int i=1;i<=*ch;i++)
		if(va[i])
			t+=((b[ch[i]]>>w)&1)-((b0[ch[i]]>>w)&1);
	if(t+(t&1)!=tot[w])
		return;
	if(~t&1)
	{
		dfs(w-1);
		return;
	}
	int lam=m+1;
	for(int I=1;I<=len[w]&&m&&lam>m;I++)
	{
		int i=pe[w][I];
		if(tch[i])
			continue;
		lam=m;
		addch(i);
		long long ti=b[i];
		if(w)
			b[i]=((b[i]>>w)|1)<<w;
		else
			b[i]|=1;
		dfs(w-1);
		b[i]=ti;
		popch();
	}
	for(int I=1;I<=*ch&&m&&lam>m;I++)
	{
		if(!va[I])
			continue;
		lam=m;
		int i=ch[I];
		addch(i);
		long long ti=b[i];
		if(w)
			b[i]=((b[i]>>w)|1)<<w;
		else
			b[i]|=1;
		dfs(w-1);
		b[i]=ti;
		popch();
	}
}
inline void calcv(vector<long long>_b)
{
	b0=b=_b;
	if(calck(b)!=ans)
		return;
	for(int j=60;~j;j--)
	{
		t1[j]=len[j]=0;
		for(int i=0;i<n;i++)
			if(~(b[i]>>j)&1)
				pe[j][++len[j]]=i,w[i]=b[i]&((1ll<<j)-1);
			else
				t1[j]++;
		sort(pe[j]+1,pe[j]+len[j]+1,cmp);
	}
	dfs(60);
}
inline void work()
{
	n=read(),m=read();
	a.resize(n);
	for(int i=0;i<n;i++)
		a[i]=read<long long>(),sum+=a[i];
	int j,t;
	for(j=60;~j;j--)
	{
		t=0;
		for(int i=0;i<n;i++)
			t+=((a[i]>>j)&1);
		if(t&1)
			break;
	}
	if(j>=0&&t==n)
	{
		int E=j;
		ans=INF;
		for(int j=60;j>E;j--)
		{
			vector<long long>b=a;
			int t=0;
			for(int i=0;i<n;i++)
				t+=(b[i]>>j)&1;
			if(t+2>n)
			{
				res[j]=INF;
				continue;
			}
			long long mx=-1;
			int p;
			for(int i=0;i<n;i++)
				if(~(b[i]>>j)&1)
				{
					long long v=b[i]&((1ll<<j)-1);
					if(v>mx)
						mx=v,p=i;
				}
			b[p]=((b[p]>>j)|1)<<j;
			mx=-1;
			for(int i=0;i<n;i++)
				if(~(b[i]>>j)&1)
				{
					long long v=b[i]&((1ll<<j)-1);
					if(v>mx)
						mx=v,p=i;
				}
			b[p]=((b[p]>>j)|1)<<j;
			res[j]=calck(b);
			ans=min(ans,res[j]);
		}
		write(ans-sum);
		for(int k=60;k>E;k--)
		{
			if(res[k]!=ans)
				continue;
			vector<long long>b=a;
			int K=0;
			for(int i=0;i<n;i++)
				if(~(b[i]>>k)&1)
					p0[++K]=i,w[i]=b[i]&((1ll<<k)-1);
			sort(p0+1,p0+K+1,cmp);
			int lalam=m+1;
			for(int I=1;I<=K&&m&&lalam>m;I++)
			{
				lalam=m;
				int lam=m+1,i=p0[I];
				long long ti=b[i];
				for(int J=I+1;J<=K&&m&&lam>m;J++)
				{
					int j=p0[J];
					lam=m;
					addch(i),addch(j);
					long long tj=b[j];
					b[i]=((b[i]>>k)|1)<<k;
					b[j]=((b[j]>>k)|1)<<k;
					calcv(b);
					b[i]=ti,b[j]=tj;
					popch(),popch();
				}
			}
		}
		V.output();
	}
	else
	{
		ans=calck(a);
		write(ans-sum);
		calcv(a);
		V.output();
	}
}
inline void clr()
{
	sum=0;
	V.clear();
}
int main()
{
	read();
	int T=read();
	while(T--)
		work(),clr();
	return 0;
}