SOJ 4309 Sum of xor 异或/思维
Source
ftiasch
解题思路:
本题的题解有参考这里,但是那篇年代太久远,讲的也不甚清晰,所以可能会对很多新手造成困扰,所以又写了这一篇。
亦或有很多规律,本题使用到的是n^(n+1)=1,其中n从0开始。即0^1=1,2^3=1,4^5=1...以此类推。
所以可以看出,当题目所给的n为奇数的时候,从0开始两两配对,可以正好配成(n+1)/2对(结合律),每一对的异或值都为1(其中可以忽略0的加入的影响,因为0与任何数异或都等于另一个数本身)。这个时候我们只需要数一下有多少个1就好啦!偶数个1会两两异或为0,奇数个则异或为1.
当题目所给的n为偶数的时候,是在n-1为奇数的前提下增加了一个偶数的n,只需要在原本的基础上,让n与前n-1个数的异或的结果相异或就好啦!
AC代码:
#include <stdio.h> #include <iostream> using namespace std; typedef long long LL; void get_ans(LL n) { if(n&1) { if(((n+1)/2)%2==1)printf("1\n"); else printf("0\n"); }else{ if(((n+1)/2)%2==1){ printf("%ld\n",n^1); }else{ printf("%ld\n",n^0); } } } int main() { LL n; while(scanf("%lld",&n)!=EOF){ get_ans(n); } return 0 ; }