解説ブログ
学び
- A〜Bのとき、累積和のように0〜A, 0〜Bから求まらないか?
- それは引き算で、XORでの引き算(打ち消しは)引きたい数をXORすること
- ビットごとに考える
- ビットごとの1の出現回数から各ビットは求まる
- 今回は不要
- もっとシンプルな解法がないか?
- 上記解法で解けるが、実装は自明ではない
- 一方、順位表を見ると多くが通している
- シンプルな解法がありそう
- ペアで考える
- 4つ組みで考える
- 実験する
- F(0, 1)
- F(0, 2)
- F(0, 3)
- ... と実験すれば周期性が見える
- 偶数奇数のどちらで単純に解けないか?
- どちらかが単純に解けたら+1することでもう片方(偶数・奇数)も解ける
感想
- rated (〜1200)参加が2603人
- Dを通したのが523人
- 参加者もレベルも上がっている
- 同じ時間にみんなで同じ問題を解くと一体感があって楽しいし、解説もTLで見られて理解が進む
久しぶりに解き直したら洗練した
ll f(ll a){
if(a<0)return 0;
if(a%4==3)return 0;
if(a%4==0)return a;
if(a%4==1)return a^(a-1);
if(a%4==2)return a^(a-1)^(a-2);
}
int main(){
cin.tie(0);
ios::sync_with_stdio(false);
ll a,b;cin>>a>>b;
ll ans = f(b)^f(a-1);
p(ans);
return 0;
}