トピック:間隔[l、r]でa + b = a xor bを満たす順序付きペア(a、b)の数を尋ねます
加算はXORと同じです。つまり、各バイナリビットで2つの数値を同時に1にすることはできません。次に、2つの数値を最上位ビットから同時に下げ、2つの数値のf、gが衝突するかどうかを示します。上限または下限に移動してから、dp。
1 #include <bits / stdc ++。h> 2 名前空間std を使用 。 3 typedef long long ll; 4 const int N = 3e5 + 10、inf = 0x3f3f3f3f ; 5 ll dp [ 35 ] [ 2 ] [ 2 ] [ 2 ] [ 2 ]; 6 int l、r; 7 int main(){ 8 int _; 9 用(scanf関数(" %のD "、&_); _-- ;){ 10 scanf(" %d%d "、&l、&r); 11 memset(dp、0、sizeof dp); 12 dp [ 32 ] [ 1 ] [ 1 ] [ 1 ] [ 1 ] = 1 ; 13 for(int u = 32 ; u> = 1 ; -u) 14 for(int f1 = 0 ; f1 <= 1 ; ++ f1) 15 for(int g1 = 0; g1 <= 1 ; ++ G1) 16 のための(INT F2 = 0 ; F2 <= 1 ; ++ F2) 17 のための(INT G2 = 0 ; G2 <= 1 ; ++ G2) 18 のための(INT iは= 0 ; I <= 1 ; ++ ++ i) 19 for(int j = 0 ; j <= 1 ; ++ j){ 20 if(i && j)continue ; 21 if(f1 && i>(r >>(u- 1)&1))続行; 22 if(g1 && i <(l >>(u- 1)&1))続行; 23 if(f2 && j>(r >>(u- 1)&1))続行; 24 if(g2 && j <(l >>(u- 1)&1))続行; 25 int f11 = f1 && i ==(r >>(u- 1)&1 ); 26 int g11 = g1 && i ==(l >>(u- 1)&1 ); )&1 ); 28 int g22 = g2 && j ==(l >>(u- 1)&1 ); 29 dp [u- 1 ] [f11] [g11] [f22] [g22] + = dp [u] [f1] [g1] [f2] [g2]; 30 } 31 ll ans = 0 ; 32 for(int f1 = 0 ; f1 <= 1 ; ++ f1) 33 for(int g1 = 0 ; g1 <= 1 ; ++ g1) 34 for(int f2 =0 ; f2 <= 1 ; ++ f2) 35 for(int g2 = 0 ; g2 <= 1 ; ++ g2) 36 ans + = dp [ 0 ] [f1] [g1] [f2] [g2]; 37 printf(" %lld \ n " 、ans); 38 } 39 return 0 ; 40 }