ll dp[33][2][2][2][2][3][3];
表示: A和B 填到第i位,(前面i-1位已经填完,现在开始填第i位),前面i-1位是否达到A的上界(la),是否达到B的上界(lb);
A的第i-1位是否是前导0(ifa0),B的第i-1位是否是前导0(ifb0) , 前i-1位填的结果,A & B > C 则为2,A & B == C 则为1,A & B < C 则为0.(比较的是AB前i-1位填的结果与C的前i-1位比较),最后是:
前i-1位填的结果A xor B > C 则为2,A xor B == C 则为1,A xor B < C 则为0.
AB前导0的维护是去掉最后取成0的情况,(如果不考虑前导0,则会多出很多不需要的解(全填0的情况))
维护上界届la,lb是为了使A<=NA,B<=NB,
维护AND,OR 是为了满足 A & B > C 或者A xor B < C
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define re register
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt=1;
void init(int n){cnt=1;for(int i=0;i<=n;i++)head[i]=0;}
struct EDGE{int to,nxt,w;}ee[M*2];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
*/
//a&b > c || a^b < c
int da[33],db[33],dc[33],sc,sa,sb,A,B,C;
ll dp[33][2][2][2][2][3][3];
ll dfs(int len,bool la,bool lb,bool ifa0,bool ifb0,int AND,int OR)
{
// cout<< len <<" "<<la<<" "<<lb<<" "<<AND<<" "<<OR<< " = "<< dp[len][la][lb][ifa0][ifb0][AND][OR]<<endl;if(len==0 )return ( AND == 2 || OR == 0) && !ifa0 && !ifb0;if(~dp[len][la][lb][ifa0][ifb0][AND][OR])return dp[len][la][lb][ifa0][ifb0][AND][OR];ll ans=0;int upa=la?da[len]:1,upb=lb?db[len]:1;for(int i=0;i<=upa;i++)//afor(int j=0;j<=upb;j++)//b{int q=i&j,w=i^j,CAND=AND,COR=OR;if(AND == 1 ){if(q > dc[len])CAND=2;else if(q == dc[len])CAND=1;else CAND = 0;}if(OR == 1 ){if(w > dc[len])COR=2;else if(w == dc[len])COR=1;else COR = 0;}// cout<<" ==== "<<i<<" "<<j<<" "<< AND<<" - "<<OR <<endl; if(CAND == 0 && COR == 2) continue;//不可能满足条件了ans+=dfs(len-1,la&&i==upa,lb&&j==upb,ifa0&&i==0,ifb0&&j==0,CAND,COR);}//cout<< len <<" "<<la<<" "<<lb<<" "<<AND<<" "<<OR<< " = "<< dp[len][la][lb][AND][OR]<<endl;//cout<<"--------------------------------- "<<ans<<endl;return dp[len][la][lb][ifa0][ifb0][AND][OR]=ans;
}
ll cal()
{sa=sb=sc=0;memset(da,0,sizeof(da));memset(db,0,sizeof(db));memset(dc,0,sizeof(dc));int fAND = C>max(A,B)?0:1;while(A){da[++sa]=A%2;A/=2;}while(B){db[++sb]=B%2;B/=2;} while(C){dc[++sc]=C%2;C/=2;} int fOR = sc>max(sa,sb)?0:1;memset(dp,-1,sizeof(dp));return dfs(max(sa,sb),true,true,true,true,fAND,fOR);
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);int T;cin>>T;while(T--){cin>>A>>B>>C;cout<<cal()<<endl;}return 0;
}