题目Problem
Sum of xor
Time Limit: 1000ms Memory Limit: 65536KB
题目链接:SMOJ
描述Descript.
求1⊙2⊙…⊙N 的值。
A⊙B 即A,B 按位异或。
输入Input
1 个整数N。
输出Output
1 个整数,表示所求的值。
样例Sample
输入数据
3
输出数据
0
备注Hint
• 对于50% 的数据,1<=N<=106;
• 对于100% 的数据,1<=N<=1018.
来源Source
ftiasch 普及组模拟赛 II
题解:
这题是一个不错的题,拿到这个题第一步我想到的是统计二进制每一位1的个数,但是统计过程就是个问题,扫一遍所有的数的话 10^18 * 64的复杂度,还不如暴力,如果用直接暴力除法正确性无法保证(二进制之间是加法关系)。
那么我们就得找一个普遍适用的规律来解决这个题目:
通过手算几位后我们发现,每隔3个数就会出现一个0,每隔三个数还会出现一个1,那我们具体推一下就发现一个性质:每四个数的异或值变为0,也就是说一个数之前的所有数的异或答案应该只与相邻四个数有关,那么我们只找这四个数即可QAQ,对4取模就可以啦~
其实这题我是打表找规律做出来的,有个神犇叫DQS他非说有公式,误导了我半天……
代码:(QAQ)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
ll a;
int main()
{
scanf("%lld",&a);
if(a == 1) printf("1\n");
else if(a % 4 == 0) printf("%lld\n",a);
else if(a % 4 == 1) printf("1\n");
else if(a % 4 == 2) printf("%lld",a^(a-1)^(a-2));
else printf("0\n");
return 0;
}