voidadd(int x, int tre[][3]){ int p = 0; for(int i = 20; i >= 0; i --){ int bit = (x >> i) & 1; if(tre[p][bit]) p = tre[p][bit]; else { tre[p][bit] = ++ cnt; p = tre[p][bit]; } } return; }
intquery_max(int x, int tre[][3]){ int res = 0, p = 0; for(int i = 20; i >= 0; i --){ int bit = (x >> i) & 1; if(tre[p][!bit]){ p = tre[p][!bit]; res += (1 << i); }else{ p = tre[p][bit]; } } return res; }
intquery_min(int x, int tre[][3]){ int res = 0, p = 0; for(int i = 20; i >= 0; i --){ int bit = (x >> i) & 1; if(tre[p][bit]){ p = tre[p][bit]; }else{ p = tre[p][!bit]; res += (1 << i); } } return res; }
voidsolve() { cin >> n; for(int i = 1; i <= n; i ++){ cin >> a[i]; }
for(int i = 0; i <= n + 1; i ++){ lmax[i] = rmax[i] = 0; lmin[i] = rmin[i] = INF; }
add(0, ltre);
for(int i = 1; i <= n; i ++){ ls[i] = ls[i - 1] ^ a[i]; lmax[i] = max(lmax[i - 1], query_max(ls[i], ltre));
intqmi(int a,int b){ int res=1; while(b){ if(b&1)res=res*a%mod; a=a*a%mod; b>>=1; } return res; } int n, m; int a[N]; int idx=0; int pw[N]; int inv[N]; int ch[N*30][2]; int num[N*30]; voidinit(){ pw[0]=1; pw[1]=2; inv[1]=qmi(2,mod-2); for(int i=2;i<=200000;i++){ pw[i]=pw[i-1]*2%mod; inv[i]=inv[i-1]*inv[1]%mod; } }
voidinsert(int x,int y){ int p=0; for(int i=29;i>=0;i--){ int u=(x>>i)&1; if(!ch[p][u])ch[p][u]=++idx; p=ch[p][u]; num[p]=(num[p]+y)%mod; } } intquery(int x){ int res=0; int p=0; for(int i=29;i>=0;i--){ int u=(x>>i)&1; int r=(m>>i)&1; if(r==1){ res+=num[ch[p][u]];res%=mod; p=ch[p][!u]; } else { p=ch[p][u]; } if(p==0)break; } res+=num[p]; res%=mod; return res; } voidsolve(){ cin>>n>>m; for(int i=1;i<=n;i++)cin>>a[i]; sort(a+1,a+1+n); int ans=0; //for(int i=1;i<=n;i++)cerr<<a[i]<<" ";cerr<<endl; // for(int i=1;i<=10;i++)cerr<<pw[i]<<" "<<inv[i]<<endl; for(int i=1;i<=n;i++){ ans=(ans+1+pw[i-1]*query(a[i])%mod)%mod; insert(a[i],inv[i]); } cout<<ans<<endl; //每次结束用到哪就清空多少 for(int i=0;i<=idx;i++)ch[i][1]=ch[i][0]=num[i]=0; idx=0; }