Smart OJ 2484 Sum of xor 思维题 [二星]

本文介绍了一道数论问题,探讨如何计算1到N所有数按位异或的和。通过观察样例和分析,发现每隔四个数的异或结果为0,从而得出解决方案。通过避免高复杂度的统计方法,转而寻找规律,简化了问题,最后通过代码实现求解。
摘要由CSDN通过智能技术生成
                                                题目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;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值