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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| #include<bits/stdc++.h> #define int long long #define ull unsigned long long #define maxn #define put() putchar('\n') #define Tp template<typename T> #define Ts template<typename T,typename... Ar> using namespace std; Tp void read(T &x){ int f=1;x=0;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();} x*=f; } namespace Debug{ Tp void _debug(char* f,T t){cerr<<f<<'='<<t<<endl;} Ts void _debug(char* f,T x,Ar... y){while(*f!=',') cerr<<*f++;cerr<<'='<<x<<",";_debug(f+1,y...);} #define gdb(...) _debug((char*)#__VA_ARGS__,__VA_ARGS__) }using namespace Debug; #define fi first #define se second #define mk make_pair const int mod=1e9+7; int power(int x,int y=mod-2) { int sum=1; while (y) { if (y&1) sum=sum*x%mod; x=x*x%mod;y>>=1; } return sum; } int n,m; int a[65],na,b[65],nb; int f[65][2][2][2]; int dfs(int id,int pos,int fl,int lim) { if (id==0) return pos==0&&fl==0; if (f[id][pos][fl][lim]!=-1) return f[id][pos][fl][lim]; int res=0; int r=(lim?a[id]:1); int i,j,k; for (i=0;i<=r;i++) { int tmp=i+b[id]-pos*2; if (tmp>=-1&&tmp<=0) res+=dfs(id-1,1,fl^i^(tmp+1),lim&&(i==r)); if (tmp>=0&&tmp<=1) res+=dfs(id-1,0,fl^i^tmp,lim&&(i==r)); } return f[id][pos][fl][lim]=res; } void solve(void) { int i,now; read(n);read(m);na=nb=0; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(f,-1,sizeof(f)); m--;now=m; while (now) a[++na]=now%2,now/=2; now=n; while (now) b[++nb]=now%2,now/=2; printf("%lld\n",dfs(max(na,nb)+1,0,1,1)); } signed main(void){ int T; read(T); while (T--) solve(); return 0; }
|