QOJ.ac

QOJ

ID提交记录ID题目HackerOwner结果提交时间测评时间
#1477#873631#9682. nim 游戏JohnAlfnovlgvcFailed.2025-01-26 19:30:382025-01-26 19:30:38

详细

Extra Test:

Accepted
time: 556ms
memory: 56744kb

input:

24 20000
5 1
860183061975792599 1079288807951101755 1116290852746401279 999728746068967421 556194549685124847
5 1
1134764719341561847 1075762157001358015 1143896429693919055 392580419766189563 864682292624359421
5 1
1060412432435740147 1152640029093199871 1146658647719259901 531405634824033071 72056...

output:

220526697032381835
1
2
2 3 
73632696655745221 146894000376636614 
54363720356426099
1
2
1 3 
18156785265285129 36206935091140970 
13088664802468359
1
2
2 3 
6825807914881284 6262856887587075 
13411204528152823
1
2
1 3 
4925950342205507 8485254185947316 
37530539055137811
1
2
2 3 
18809704190059026 1...

result:

ok correct answer

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#873631#9682. nim 游戏lgvc100 ✓760ms58328kbC++234.6kb2025-01-26 18:53:592025-01-31 21:40:35

answer

#include <bits/stdc++.h>
#define int long long
static char buf[1000000],*paa=buf,*pd=buf;
static char buf2[1000000],*pp=buf2;
#define getchar() paa==pd&&(pd=(paa=buf)+fread(buf,1,1000000,stdin),paa==pd)?EOF:*paa++
inline void pc(char ch){
	if(pp-buf2==1000000) fwrite(buf2,1,1000000,stdout),pp=buf2;
	*pp++=ch;
}
inline void pcc(){
	fwrite(buf2,1,pp-buf2,stdout);
	pp=buf2;
}
inline int read(void){
	int w=1;
	register int x(0);register char c(getchar());
	while(c<'0'||c>'9'){if(c=='-') w=-1;c=getchar();}
	while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return w*x;
}
void write(int x){
	static int sta[20];
	int top=0;
	do{
		sta[top++]=x%10,x/=10;
	}while(x);
	while(top) pc(sta[--top]+48);
}
void we(int x){
	write(x);
	pc('\n');
}
int C,T,N,M,a[100009],b[100009],vf[100009],ss,p[62][100009];
struct n_t{
	int a,b;
};
std::vector<n_t> t[20009];
int ct,tx;
int qr(std::vector<n_t> tq) {
	int as=ss;
	for(int i=0;i<tq.size();i++) {
		as^=a[tq[i].a];
		as^=(a[tq[i].a]+tq[i].b);
	}
	return as;
}
inline bool cmp(n_t x,n_t y) {
	return x.a<y.a;
}
inline bool fd(int x,std::vector<n_t> y) {
	for(int i=0;i<y.size();i++) {
		if(y[i].a==x) return 1;
	}
	return 0;
}
int vc(std::vector<n_t> tq) {
	tx++;
	for(int i=0;i<tq.size();i++) vf[tq[i].a]=tx;
	return tx;
}
int sv(std::vector<n_t> tq) {
	int aq=0;
	int ti=vc(tq);
	int xx=qr(tq);
	for(int i=60;i>=0;i--) {
		if((xx>>i)&1) {
			bool zt=0;
			for(int j=1;j<=N;j++) {
				int t=p[i][j];
				if((a[t]>>i)%2==0) {
					if(vf[t]==ti) continue;
					int x=(a[t]&((1ll<<i)-1));
					xx^=(a[t]);
					xx^=(a[t]+(1ll<<i)-x);
					aq+=(1ll<<i)-x;
					tq.push_back((n_t){t,(1ll<<i)-x});
					vf[t]=ti;
					zt=1;
					break;
				} else {
					break;
				}
			}
			if(!zt) {
				for(int j=0;j<tq.size();j++) {
					int x=tq[j].b+a[tq[j].a];
					if(x&((1ll<<i+1)-1)) continue;
					xx^=x;
					xx^=(x+(1ll<<i));
					tq[j].b+=(1ll<<i);
					aq+=(1ll<<i);
					zt=1;
					break;
				}
				if(!zt) {
					return (1ll<<62);
				}
			}
		}
	}	
	return aq;	
}
std::unordered_map<int,int> vi;
int tc;
void cl(std::vector<n_t> tq) {
	if(ct==M) return;
	std::sort(tq.begin(),tq.end(),cmp);
	int vm=tq.size();
	for(int j=0;j<tq.size();j++) {
		vm=(vm*137+tq[j].a)%10000000000000061ll;
		vm=(vm*137+tq[j].b)%10000000000000061ll;
	}
	if(vi[vm]==tc) return;
	vi[vm]=tc;
	ct++;
	t[ct]=tq;
}
bool qj(int i,std::vector<n_t> tq,int va) {	
	if(va!=sv(tq)) return 0;
	if(i==-1) {
		cl(tq);
		return 1;
	}
	if((qr(tq)>>i)&1) {
		//if(i==0) printf("!!!\n");
		int ans=(1ll<<61);
		for(int j=1;j<=N;j++) {
			int t=p[i][j];
			if(fd(t,tq)) continue;
			if((a[t]>>i)%2==0) {
			//	assert(t);
				int x=(a[t]&((1ll<<i)-1));
				tq.push_back((n_t){t,(1ll<<i)-x});
				if(!qj(i-1,tq,va-(1ll<<i)+x)) return 1;
				tq.pop_back();
				if(ct==M) return 1;
			} else break;
		}
		for(int j=0;j<tq.size();j++) {
			int x=tq[j].b+a[tq[j].a];
			if(x&((1ll<<i+1)-1)) continue;
			tq[j].b+=(1ll<<i);
			if(!qj(i-1,tq,va-(1ll<<i))) return 1;
			if(ct==M) return 1;
			tq[j].b-=(1ll<<i);
		}
	} else {
		qj(i-1,tq,va);
	}
	return 1;
}
#define INF_LL 0x3f3f3f3f3f3f3f3f
int tp;
bool cmq(int x,int y) {
	x=a[x];
	y=a[y];
	if(((x^y)>>tp)&1) 
		return (x&((1ll<<tp+1)-1))<(y&((1ll<<tp+1)-1));
	return (x&((1ll<<tp)-1))>(y&((1ll<<tp)-1));
}
signed main(void) {
	C=read();T=read();
	while(T--) {
		tc++;
		N=read();M=read();
		ct=0;
		ss=0;
		for(int i=1;i<=N;i++) {
			a[i]=read();
			b[i]=a[i];
			ss^=a[i];
		}
		if(ss==0) {
			printf("0\n1\n0\n\n\n");
			continue;
		}
		for(int i=0;i<=60;i++) {
			for(int j=1;j<=N;j++) p[i][j]=j;
			tp=i;
			std::sort(p[i]+1,p[i]+N+1,cmq);
		}
		std::vector<n_t> tq;
		int ans=sv(tq);
		for(int i=0;i<=60;i++) {
			std::vector<n_t> tq;
			if(ss>=(1ll<<i+1)) continue;
			int t=p[i][1];
			if((a[t]>>i)&1) continue;
			int x=(a[t]&((1ll<<i)-1));
			tq.push_back((n_t){t,(1ll<<i)-x});
			ans=std::min(ans,sv(tq)+(1ll<<i)-x);
		}
		qj(60,tq,ans);
		for(int i=0;i<=60;i++) {
			if(ct==M) break;
			if(ss>=(1ll<<i+1)) continue;
			std::vector<n_t> tq;
			for(int j=1;j<=N;j++) {
				int t=p[i][j];
				if((a[t]>>i)&1) break;
				int x=(a[t]&((1ll<<i)-1));
				tq.push_back((n_t){t,(1ll<<i)-x});
				if(!qj(i,tq,ans-(1ll<<i)+x)) break;
				if(ct==M) break;
				tq.pop_back();
			}
		}
//		qj(60,tq,ans);
		printf("%lld\n%lld\n",ans,ct);
		for(int i=1;i<=ct;i++) {
			printf("%lld\n",(int)t[i].size());
			for(int j=0;j<t[i].size();j++) printf("%lld ",t[i][j].a);
			printf("\n");
			for(int j=0;j<t[i].size();j++) printf("%lld ",t[i][j].b);
			printf("\n");
			t[i]=t[0];
		}	
	}
}