【发布时间】:2012-05-20 02:40:00
【问题描述】:
给您一个很大的范围 [a,b],其中“a”和“b”通常可以在 1 到 4,000,000,000 之间。你必须找出给定范围内所有数字的异或。
TopCoder SRM 中使用了这个问题。我在比赛中看到了其中一个提交的解决方案,但我无法弄清楚它是如何工作的。
有人可以帮助解释获胜的解决方案吗:
long long f(long long a) {
long long res[] = {a,1,a+1,0};
return res[a%4];
}
long long getXor(long long a, long long b) {
return f(b)^f(a-1);
}
这里,getXor() 是计算传递范围 [a,b] 中所有数字的异或的实际函数,“f()”是一个辅助函数。
【问题讨论】:
-
我稍微编辑了你的问题。我们不介意解释某些代码的原因,但我们不需要其他方法的新列表来解决这个问题。把它留给 TopCoder。
-
@Kev 没问题!我这么写是因为有些人喜欢给出自己的方式,而不是解释已经写好的东西。任何新想法都不会浪费...... ;)
-
这对于
a<=0或b<0具有未定义的行为。long long是有符号类型,因此x%4对于负输入为负(或 0)。也许您希望unsigned long long和/或a & 3为数组编制索引?
标签: algorithm