ABC238 参加記録
コンテスト中AC: A〜D
A - Exponential or Quadratic
から、が64bit整数型に収まらなければ、直ちにYesです。
よって、64bit型を超えるまでは、実際に2を掛けていきます。そして、超えた時点でYesとします。
超えなかった場合は、実際に比較してみれば良いです。
2を掛ける最大回数は、おそらく64くらいだと思います。
オーバーフローの判定はC++(GCC?)なら、__builtin_sumlll_overflow
でできます。
提出コード
D - AND and SUM
という風に表記したとき、2進数の下からiビット目とします。
の時、とするしかありません。
の時、の3パターンがあり得ます。少なくとも一方は0にする必要があり、それはどちらでも良いので、と仮定しておきます。この時、となります。
及び桁上がりによって、以下のように下の桁から順に、を決定、もしくは、達成可能か決定できます。
の場合
このケースではで、桁上がりが必ず発生します。の場合
と桁上がり1を計算すると、1+1+1 = 11になります。- の場合、計算結果と一致しないのでNoです。
- の場合、矛盾しないので問題ないです。
の場合
と桁上がり0を計算すると、1+1+0 = 10になります。- の場合、矛盾しないので問題ないです。
- の場合、計算結果と一致しないのでNoです。
このケースではです。の場合
- の場合、とします。0+1+1=10で、桁上がりが発生します。
- の場合、とします。0+0+1=01です。
の場合
- の場合、とします。0+0+0=00です。
- の場合、とします。0+1+0=01です。
なお、十分に大きい桁(今回なら制約上60桁目)まで、上記処理を行った後、桁上がりが残っていた場合もNoになります。
公式解説メモ
より、
より、を満たしていなければNo
とおく。
という連立方程式を解く問題となる。桁上がりは不要で、各bitのみを見れば良い。
となるbitがあると、達成できずNoとなる。
よって、となるかどうかで判定ができる。
連立方程式の解き方
を仮定すると、より、両辺のa XORを取ると、
となるので、より、
を満たせば良いです。
公式解説は、の組が4通りの考慮が必要で、更にそこからa AND b = 0という条件を導き出さないといけないので、それよりは多少楽かなと思いました。