
/// TRIE…….XOR SUM(LESS THAN K)……

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 5000050

bool check(ll n,ll pos)
{
    return (bool)(n&(1LL<<pos));
}


ll cumxor[100005];
ll n;


struct Trie
{
    ll nextt[maxn][2];
    ll traverse[maxn];
    ll sz;
    Trie()
    {
        clear();
    }
    void clear()
    {
        sz=0;
        memset(nextt[0],-1,sizeof(nextt[0]));
        memset(traverse,0,sizeof traverse);
    }
    void add(ll val)
    {
        ll v=0;
        for(ll i = 32; i>= 0; --i)
        {
            int id = check(val,i);
            if(nextt[v][id] == -1)
            {
                nextt[v][id]=++sz;
                memset(nextt[sz],-1,sizeof(nextt[sz]));
            }
            v=nextt[v][id];
            traverse[v]++;
        }
    }
    ll dfs(ll val,ll k)
    {
        ll v=0;
        ll ans=0;
        for(ll i=32; i>=0 ; i--)
        {
            ll id=check(val,i);
            ll kid=check(k,i);
            if(kid==1){
                ans+=traverse[nextt[v][id]];
                v=nextt[v][id^1];
            }
            else
                v=nextt[v][id];
            if(v==-1)
                break;
        }
        return ans;
    }
};

Trie tree;
vector<ll>as;

int main()
{
    ll tes,k;
    scanf("%lld",&tes);
    for(ll cas=1;cas<=tes;cas++)
    {
          tree.clear();
          scanf("%lld%lld",&n,&k);
          tree.add(0);
          ll ans=0;
          for(ll i=1;i<=n;i++)
          {
              scanf("%lld",&cumxor[i]);
              cumxor[i]=cumxor[i-1]^cumxor[i];
              ans+=tree.dfs(cumxor[i],k);
              tree.add(cumxor[i]);
          }
          printf("%lld\n",ans);
    }
    return 0;
}
