双 log 求卡常
查看原帖
双 log 求卡常
682739
nr0728楼主2025/2/3 09:40
#include<bits/stdc++.h>
#define int unsigned
#define rep(i,a,b) for(int i(a);i<=(b);++i)
#define req(i,a,b) for(int i(a);i>=(b);--i)
using namespace std;
char buf[1<<23],*p1=buf,*p2=buf,ubuf[1<<23],*u=ubuf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
template<typename TP> inline TP read(TP &num)
{
	TP x=0;
	int f=0;
	char ch=getchar();
	while(ch<48||ch>57) f|=ch=='-',ch=getchar();
	while(48<=ch&&ch<=57) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return num=f?-x:x;
}
template<typename ...Args> inline void read(Args &...args)
{
	(read(args),...);
}
template<typename TP> inline void write(TP x)
{
	(x<0)?(putchar('-'),x=-x):0;
	(x>9)?(write(x/10),0):0;
	putchar((x%10)^48);
}
template<typename TP> inline void writeln(TP x)
{
	write<TP>(x);
	puts("");
}
int n,a[500001],b[500001],ans;
void rdx_sort(int *a,int n)
{
	const int B=256;
	int *o=new int[n],c[B]={0},*in=a,*tmp=o;
	rep(p,0,3)
	{
		fill(c,c+B,0);
		rep(i,0,n-1) ++c[(in[i]>>(p*8))&0xFF];
		int t=0,tt=0;
		rep(i,0,B-1) tt=c[i],c[i]=t,t+=tt;
		rep(i,0,n-1)
		{
			int tt=(in[i]>>(p*8))&0xFF;
			tmp[c[tt]++]=in[i];
		}
		swap(in,tmp);
	}
	if(in!=a) memcpy(a,o,sizeof(int)*n);
	delete []o;
}
int ptrL1c,ptrR1c,ptrL2c,ptrR2c;
inline int calc(int x)
{
    if(x!=30) return (1<<(x+2))-1;
    return 4294967295;
}
signed main()
{
	read(n);
	rep(i,1,n) read(a[i]);
	rep(k,0,30)
	{
		int mod=1u<<(k+1);
		rep(i,1,n) b[i]=a[i]%mod;
		rdx_sort(b+1,n);
		int cnt=0;
		rep(i,1,n)
		{
			int x=b[i];
			int L1=(1u<<k)-x;
			int R1=(1u<<(k+1))-1-x;
			int part1=0;
			if(L1<=R1)
			{
				int left=lower_bound(b+i,b+n+1,L1)-b;
				int right=upper_bound(b+i,b+n+1,R1)-b;
				part1=right-left;
			}
			int L2=(3u<<k)-x;
			int R2=calc(k+2)-x;
			int part2=0;
			if(L2<=R2)
			{
				int left2=lower_bound(b+i,b+n+1,L2)-b;
				int right2=upper_bound(b+i,b+n+1,R2)-b;
				part2=right2-left2;
			}
			cnt+=part1+part2;
		}
		if(cnt%2) ans|=1u<<k;
	}
	writeln(ans);
	return 0;
}
2025/2/3 09:40
加载中...