• SOJ


    11598. XOR

    Constraints

    Time Limit: 1 secs, Memory Limit: 256 MB

    Description

    Given two integers S and F, what is the XOR (exclusive-or) of all numbers between S andF (inclusive)?

    Input

    The first line of input is the integer T, which is the number of test cases (1 ≤ T ≤ 1000). Tlines follow, with each line containing two integers S and F (1 ≤ S ≤ F ≤ 1 000 000 000).

    Output

    For each test case, output the (decimal) value of the XOR of all numbers between S and F, inclusive.

    Sample Input

    5
    3 10
    5 5
    13 42
    666 1337
    1234567 89101112
    

    Sample Output

    8
    5
    39
    0
    89998783
    

    Problem Source

    2014年每周一赛第八场

    题意:计算区间[S,F]所有整数的异或和。

    思路:先讨论S==1时的情况:若F为奇数,则看F/2是否为奇数,若是则结果为0,否则为1;若F为偶数,则看F/2是否为奇数,若是则结果为F+1,否则为F。

       S^...^F == (1^...^F) ^ (1^...^(S - 1))

     1 // Problem#: 11598
     2 // Submission#: 3058633
     3 // The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
     4 // URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
     5 // All Copyright reserved by Informatic Lab of Sun Yat-sen University
     6 #include<bits/stdc++.h>
     7 using namespace std;
     8 int main()
     9 {
    10     int t,s,f,ss,ff;
    11     scanf("%d",&t);
    12     while(t--)
    13     {
    14         scanf("%d%d",&s,&f);
    15         if(f&1)ff=!((f>>1)&1);else ff=f+((f>>1)&1);
    16         s--;
    17         if(s&1)ss=!((s>>1)&1);else ss=s+((s>>1)&1);
    18         printf("%d
    ",ff^ss);
    19     }
    20     return 0;
    21 }                                 

    今天又研究出另一种解法:

    先来观察一组二元序列:

    00,01,10,11;

    100,101,110,111;

    1000,1001,1010,1011;

    ……

    可见每组元素的异或和一定为0,即只要F的二进制表示以11结尾,那么区间[0,F]内所有整数的异或和一定为0.

    于是有下面这个公式:

    设sumofxor(x)为区间[0,x]内所有整数的异或和,则有

     1 // Problem#: 11598
     2 // Submission#: 3063400
     3 // The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
     4 // URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
     5 // All Copyright reserved by Informatic Lab of Sun Yat-sen University
     6 #include<bits/stdc++.h>
     7 using namespace std;
     8 int sumofxor(int x)
     9 {
    10     int i,j,s;
    11     for(i=0;i<=3;i++)
    12     if((x & 0x3) == i)
    13     {
    14         s = 0;
    15         for(j=3-i;j>=1;j--)s ^= (x + j);
    16         return s;
    17     }
    18     return 0;
    19 }
    20 int main()
    21 {
    22     int t,s,f;
    23     scanf("%d",&t);
    24     while(t--)
    25     {
    26         scanf("%d%d",&s,&f);
    27         printf("%d
    ",sumofxor(f) ^ sumofxor(s-1));
    28     }
    29     return 0;
    30 }                                 
  • 相关阅读:
    php错误抑制符
    php执行运算符
    php中一个经典的!==的用法
    php实现简单验证码的功能
    jquery是什么
    php连接符
    php与java语法的区别
    考雅思策略
    php魔术常量
    PHP中数据类型转换的三种方式
  • 原文地址:https://www.cnblogs.com/gangduo-shangjinlieren/p/4041760.html
Copyright © 2020-2023  润新知