Если n> = 0, тогда (как вы говорите) 1 ^ 2 ^ ... ^ n
можно вычислить как:
long long PositiveXor(long long n){
switch (n % 4){
case 0: return n ;
case 1: return 1 ;
case 2: return n+1 ;
case 3: return 0 ;
}
}
Аналогично, если n < 0
, то n ^ (n+1) ^ ... ^ -1
можно вычислить как:
long long NegativeXor(long long n){
switch ((-n) % 4){
case 0: return 0 ;
case 1: return n ;
case 2: return 1 ;
case 3: return n-1 ;
}
}
(Это предполагает представление дополнения до 2).
Так что если l >= 0
, ответ будет PositiveXor(r) ^ PositiveXor(l-1)
;и если l < 0
и r >= 0
, ответ будет NegativeXor(l) ^ PositiveXor(r)
. Я оставлю третий случай (r < 0
) на ваше усмотрение.