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 ;  
}  

 

posted @ 2017-10-06 12:00  87hbteo  阅读(243)  评论(0编辑  收藏  举报