Hướng dẫn giải của Bedao Regular Contest 14 - SUMXOR


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
  • Ta có thể tính ~\text{XOR}~ của đoạn ~[1 , L - 1]~ và đoạn ~[1 , R]~, sau đó ~\text{XOR}~ hai kết quả này lại với nhau.
  • Ta có thể tính nhanh phép ~\text{XOR}~ của đoạn ~[1 , R]~ bằng cách xét modulo ~4~ của ~R~:
  • ~n~ ~\%~ ~4~ ~=~ ~0~ thì kết quả ra ~n~.
  • ~n~ ~\%~ ~4~ ~=~ ~1~ thì kết quả ra ~1~.
  • ~n~ ~\%~ ~4~ ~=~ ~2~ thì kết quả ra ~n~ ~+~ ~1~.
  • ~n~ ~\%~ ~4~ ~=~ ~3~ thì kết quả ra ~0~.

Code mẫu

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

void minimize(long long &x,long long y){
   if(x>y){
      x=y;
   }
}

void maximize(long long &x,long long y){
    if(x<y){
        x=y;
    }
}

template <typename T> inline void read(T & x)
{
    char c; bool nega=0;
    while((!isdigit(c=getchar()))&&c!='-');
    if(c=='-')
    {
        c=getchar();
        nega=1;
    }
    x=c-48;
    while(isdigit(c=getchar()))
    {
        x=x*10+c-48;
    }
    if(nega) x=-x;
}
template <typename T> void Write(T x) {if (x > 9) Write(x/10); putchar(x%10+48);}
template <typename T> void write(T x) {if (x < 0) {putchar('-'); x = -x;} Write(x);}

long long pow_mod(long long a, long long b, long long m) {
     long long res = 1;
     while(b){
            res = res * (b & 1 ? a : 1) % m;
            a = a * a % m; b >>= 1;
     }
     return res;
}

long long GCD(long long a , long long b){
    while(b != 0 ){
         a = a % b;
         long long tmp = a;
         a = b;
         b = tmp;
    }
    return a;
}

long long minn(long long a ,long long b , long long c ,long long d){
    long long res = a;
    if(res > d) res = d;
    if(res > b) res = b;
    if(res > c) res = c;
    return res;
}
const ll INF = 1e18 + 7;
const ll MAXN=  2e5 + 7;
ll findXOR(ll n)
{
    int mod = n % 4;
    if (mod == 0)
        return n;

    else if (mod == 1)
        return 1;

    else if (mod == 2)
        return n + 1;

    else if (mod == 3)
        return 0;
}

ll findXOR(ll l, ll r)
{
    return (findXOR(l - 1) ^ findXOR(r));
}
int main(){
    // freopen("new.inp" , "r" , stdin);
    // freopen("new.out" , "w" , stdout);
    ll s , t;
    int n ;
    read(n);
    while(n --){
        read(s); read(t);
        write(findXOR(s , t));
        putchar('\n');
    }

    return 0;
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.