1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include<cstdio> #include<cstring> #include<iostream> using namespace std; long long f[40][2][2][2][2][2][2][2];
int T,a,b,k,w; long long dfs(int len,int xa,int xb,int xky,int addx,int ykx,int addy,int xyw) { if (len==31) { if (xa&&xb&&(xky||(!xky&&addx))&&(ykx||(!ykx&&addy))&&xyw) return 1; return 0; } if (f[len][xa][xb][xky][addx][ykx][addy][xyw]!=-1) return f[len][xa][xb][xky][addx][ykx][addy][xyw]; long long ans=0; int abit=(a>>len)&1,bbit=(b>>len)&1,kbit=(k>>len)&1,wbit=(w>>len)&1; for (int i=0;i<=1;i++) for (int j=0;j<=1;j++) { bool nxa=(xa&&i<=abit)||(!xa&&i<abit); bool nxb=(xb&&j<=bbit)||(!xb&&j<bbit); bool nxky=(xky&&((i+kbit+addx)&1)>=j)||(!xky&&((i+kbit+addx)&1)>j); bool nykx=(ykx&&((j+kbit+addy)&1)>=i)||(!ykx&&((j+kbit+addy)&1)>i); bool naddx=(i+kbit+addx)>>1; bool naddy=(j+kbit+addy)>>1; bool nxyw=(xyw&&(i^j)<=wbit)||(!xyw&&(i^j)<wbit); ans+=dfs(len+1,nxa,nxb,nxky,naddx,nykx,naddy,nxyw); } return f[len][xa][xb][xky][addx][ykx][addy][xyw]=ans; } int main() { scanf("%d",&T); while (T--) { scanf("%d%d%d%d",&a,&b,&k,&w); memset(f,-1,sizeof(f)); dfs(0,1,1,1,0,1,0,1); printf("%lld\n",f[0][1][1][1][0][1][0][1]); } }
|