CodeForces-1245Fダニエルとスプリングクリーニング(数位dp)

トピック:間隔[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、0sizeof dp);
12          dp [ 32 ] [ 1 ] [ 1 ] [ 1 ] [ 1 ] = 1 ;
13          forint u = 32 ; u> = 1 ; -u)
 14              forint f1 = 0 ; f1 <= 1 ; ++ f1)
 15                  forint 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                                  forint 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          forint f1 = 0 ; f1 <= 1 ; ++ f1)
 33              forint g1 = 0 ; g1 <= 1 ; ++ g1)
 34                  forint f2 =0 ; f2 <= 1 ; ++ f2)
 35                      forint g2 = 0 ; g2 <= 1 ; ++ g2)
 36                          ans + = dp [ 0 ] [f1] [g1] [f2] [g2];
37          printf(" %lld \ n " 、ans);
38      }
 39      return  0 ;
40 }

 

おすすめ

転載: www.cnblogs.com/asdfsag/p/12686830.html