https://ac.nowcoder.com/acm/contest/3004/E
1の#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 CONST 長い 長 MOD =(INT)1E9 + 7 。 4 INT I、I 0、T。 5 長い 長い CNTA [ 70 ]、CNTB [ 70 ]、DP [ 70 ] [ 70 ] [ 2 ]、[ 70 ]。 6つの 長い 長い DFS(INT LEN、BOOLマキシ、INT K、ブールF) 7 { 8 もし(DP [LEN] [K] [F] = - !1 &&マキシ!)戻りDP [LEN] [K] [F]。 9 もし(!LEN)リターンF; 10 長い 長い CNT = 0 。 11 INT限界=マキシA [LEN]:1 。 12 のために(INT iが= 0 ; I <=リミット; I ++ ){ 13 、CNT + = DFSは(len- 1、マキシ&& A [LEN] == I、K、F || LEN == K && Iに)。 14 } 15 リターンマキシCNT:DP [LEN] [K] [F] = CNT。 16 } 17 長い ロングDIV(長い 長 TMP、INT K) 18 { 19 のmemset(0、はsizeof ())。 20 INT P = 0 。 21 一方(TMP)++ P] = TMP%2、TMP / = 2 。 22の リターン DFS(p、1、K、0 ); 23 } 24 長い 長 INV(長い 長い X、長い 長いMOD) 25 { 26 長い 長 K = mod-2、ANS = 1 。 27 一方、(K) 28 { 29 であれば(K&1)ANS = ANS * X%MOD。 30 X = X * X%のMOD。 31 K >> = 1 。 32 } 33 リターンANS。 34 } 35 、INT ()主 36 { 37 のmemset(DP、 - 1、はsizeof (DP))。 38 のscanf(" %dの"、&T)。 39 しばらく(T--){ 40 長い 長 L1、R1、L2、R2、P = 1、ANS = 0 。 41 のscanf(" %LLD%LLD%LLD%LLD "、&L1&R1、&L2、およびR2)。 42の L1 - 、l2-- 。 43 のために(iは= 1 ; I <= 60、I ++、P * = 2 ){ 44 CNTA [I] = DIV(R1、I) - DIV(L1、I)。 45 CNTB [I] = DIV(R2、I) - DIV(L2、I)。 46 ANS + =(CNTA [I]%MOD *((R2-L2-CNTB [I])%のMOD)%MOD + CNTB [I]%MOD *((R1-L1-CNTA [I])%のMOD)% MOD)*(P%MOD)%のMOD。 47 %ANS = V。 48 } 49 ANS%= V、V = + ANS、ANS%= V。 50 ANS = ANS * INV(((R1-L1)のV%)*((R 2 L 2)v%で)%のV、V)%のV。 51 のprintf(" %のLLD \ n " 、ANS)。 52 } 53 リターン 0 。 54 }