Tuesday, June 21, 2011

Xor Range without LOOP

HOW to get Xor between numbers from 1 to 300000000
you will get TLE if you try to use Loop for all numbers

I ask this Question on the codeforces site Click Here to see the discussion

jacob answer
Let's introduce
f(x) = x ^ (x-1) ^ (x-2) ^ ... ^ 1
Then anwer would be
f(end) ^ f(start - 1)
Let's now learn to calculate f(x) fast enough. First, notice that f(4*k - 1) = 0 (provable by induction). So to calculate f(x) you only need to take at most 4 last numbers and xor them.
Finally,
f(4*k) = 4*k
f(4*k + 1) = 1
f(4*k + 2) = 4*k + 3
f(4*k + 3) = 0

Expressions "at most 4 last numbers" and "only last 4 numbers" are different. In fact, you need to take exactly (x+1)%4 last numbers.

Conclusion:
Use this function

int f(int n){
switch(n%4){
case 0: return n;
case 1: return 1;
case 2: return n+1;
default: return 0;
}
}
so if you want to get Xor between numbers in range start to end

f(start)^f(end-1)

No comments:

Post a Comment