QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#892791#5053. Random ShuffleFlamireWA 493ms3840kbC++172.2kb2025-02-10 13:35:062025-02-10 13:35:12

Judging History

This is the latest submission verdict.

  • [2025-02-10 13:35:12]
  • Judged
  • Verdict: WA
  • Time: 493ms
  • Memory: 3840kb
  • [2025-02-10 13:35:06]
  • Submitted

answer

#include <bits/stdc++.h>
#define N 100011
#define lll __int128
#define ull unsigned long long
#define ppcll __builtin_popcountll
using namespace std;
int k[N],T,n,a[N],id[N];
vector<lll> w;
void gauss()
{
	int cc=0;
	for(int i=0;i<64;++i)
	{
		int id=-1;
		for(int j=i;j<w.size();++j)if(w[j]>>i&1){id=j;break;}
		// assert(~id);
		if(!~id){++cc;continue;}
		swap(w[i],w[id]);
		for(int j=0;j<w.size();++j)if(j!=i&&(w[j]>>i&1))w[j]^=w[i];
	}
	// printf("cc:%d\n",cc);
	// for(int i=0;i<w.size();++i)
	// {
	// 	for(int j=0;j<64;++j)printf("%d",int(w[i]>>j&1));putchar(10);
	// }
}
ull x[64];
void splitmix()
{
	for(int i=63;i>=13;--i)x[i]^=x[i-13];
	for(int i=0;i<=56;++i)x[i]^=x[i+7];
	for(int i=63;i>=17;--i)x[i]^=x[i-17];
}
const int W=68;
ull splitmix(ull x)
{
	x^=x<<13;
	x^=x>>7;
	x^=x<<17;
	return x;
}
bool check(ull x)
{
	static int tk[N];
	for(int i=1;i<=n;++i)
	{
		tk[i]=(x=splitmix(x))%i;
		if(tk[i]^k[i])return 0;
	}
	return 1;
}
int main()
{
	scanf("%d",&T);while(T--)
	{
		scanf("%d",&n);
		for(int i=1;i<=n;++i)scanf("%d",a+i),id[a[i]]=i;
		for(int i=n;i;--i)
		{
			k[i]=id[i]-1;
			int x=id[i];
			id[a[i]]=x;
			swap(a[i],a[x]);
		}
		// for(int i=1;i<=n;++i)printf("%d ",k[i]);putchar(10);
		for(int i=0;i<64;++i)x[i]=(ull)1<<i;
		w.clear();
		if(n>W)
		{
			for(int i=1;i<=W;++i)
			{
				splitmix();
				for(int j=0;(i&(ull)(1<<j+1)-1)==0;++j)
				{
					w.push_back(x[j]|(lll)(k[i]>>j&1)<<64);
				}
			}
			gauss();
			ull ans=0;
			for(int i=0;i<64;++i)if(w[i]>>64&1)ans|=(ull)1<<i;
			printf("%llu\n",ans);
		}
		else
		{
			for(int i=1;i<=50;++i)
			{
				splitmix();
				for(int j=0;(i&(ull)(1<<j+1)-1)==0;++j)
				{
					w.push_back(x[j]|(lll)(k[i]>>j&1)<<64);
				}
			}
			gauss();
			for(int S=0;S<1<<19;++S)
			{
				ull K=(ull)S<<45;
				bool ok=1;
				for(int i=45;i<=46;++i)if((ppcll((ull)(K&w[i]))&1)!=(w[i]>>64&1)){ok=0;break;}
				if(!ok)continue;
				ull x=K;
				for(int i=0;i<45;++i)
				{
					int bit=(ppcll((ull)(K&w[i]))&1)^(w[i]>>64&1);
					x|=(ull)bit<<i;
				}
				if(check(x)){printf("%llu\n",x);break;}
			}
		}
	}
	fclose(stdin);fclose(stdout);return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 493ms
memory: 3840kb

input:

50
36 22 24 21 27 50 28 14 25 34 18 43 47 13 30 7 10 48 20 16 29 9 8 15 3 31 12 38 19 49 37 1 46 32 4 44 11 35 6 33 26 5 45 17 39 40 2 23 42 41

output:


result:

wrong output format Unexpected end of file - int64 expected