#include <bits/stdc++.h> typedef long long LL; const int MOD = (int)1e9 + 7; LL L,R,G,T; int dp[62 + 1][2][2][2][2]; bool vis[62 + 1][2][2][2][2]; inline void add(int &a,int b) { a += b; if (a >= MOD) a -= MOD; if (a < 0) a += MOD; } int calc(int at,bool al,bool ar,bool bl,bool br) { if (at == -1) { return 1; } if (vis[at][al][ar][bl][br]) { return dp[at][al][ar][bl][br]; } vis[at][al][ar][bl][br] = true; int &ret = dp[at][al][ar][bl][br]; ret = 0; int l = L >> at & 1, r = R >> at & 1, x = (G ^ T) >> at & 1; for (int a = 0; a < 2; ++ a) { if (al && a < l) continue; if (ar && a > r) continue; int b = x ^ a; if (bl && b < l) continue; if (br && b > r) continue; add(ret,calc(at - 1,al && a == l,ar && a == r,bl && b == l,br && b == r)); } return ret; } int work() { if ((G ^ T) == 0) return (R - L + 1) % MOD; memset(vis,false,sizeof(vis)); return ((R - L + 1) * 2 % MOD - calc(62,true,true,true,true) + MOD) % MOD; } int main() { int cas; scanf("%d",&cas); while (cas--) { scanf("%I64d%I64d%I64d%I64d",&L,&R,&G,&T); printf("%d\n",work()); } }
GTW likes czf
从前,有两个人名叫GTW,DSY。一天,他们为了争夺DSY的妹子CZF,决定进行一次决斗。首先,CZF会给出一个区间l,l+1,l+2......rl,l+1,l+2......r,和两个数G,TG,T。现在,CZF会在G,TG,T两个数中随机一个数XX,在区间l,rl,r中随机一个数Y,进行一种特殊的运算@。CZF想要快速知道有多少数字可能会是答案。 然而GTW并不会做这道题,但是为了赢得CZF,他就来寻求你的帮助。 由于答案可能会很大,所以把最终的答案模1000000007。 我们规定运算X @ Y =((X and Y) or Y) xor X.
原文:http://www.cnblogs.com/get-an-AC-everyday/p/5139519.html