网上找的模板,还不太懂,改了下,先留着
LL Get(LL dis, LL l, LL P, LL number)
{
LL ret = 0;
ret += (l / P) * number;
l %= P;
ret += (dis / P) * number * (number - 1) / 2;
dis %= P;
if (dis * number + l < P)
return ret;
else
return ret + Get(P, (dis * number + l) % P, dis, (dis * number + l) / P);
}
LL GetYiHuo(LL l, LL r, LL dis) //以x开始, y为结束, dis为等差 连续异或
{
//number为计算的个数
LL number = (r - l) / dis + 1, ans = 0, Sum, P = 1;
for (LL i = 1; i <= 10; i++)
{
Sum = Get(dis, l, P, number);
if (Sum & 1)
ans += P;
P <<= 1;
}
return ans;
}