従って、異なる2048個の値から、任意の2つを取り出してXORがゼロになる計算は2048回(O(n))で済むし、任意の3つを取り出してXORがゼロになる計算は2048×2048回(O(n2))で済む。入力データを平方数と非平方数に分けた。平方数同士では、XORがゼロになる。平方数と非平方数とのXORはゼロにならない。非平方数と非平方数とのXORがゼロになるのは、その2つの非平方数が等しい場合に限る。入力データの処理にscanf()ではなく、read()関数を使った。getchar()を使ってランク2にできたが、1位になるには、read()を使ってしまった。計算のオーバーフローに気をつけよう。整数同士の積に64ビット整数を使おう。ans;}XとYを算出する部分(分かりやすくするため、ソースの一部を書き直した。ソースそのものとは異なる)。freq[a]はビットパターンがaである入力データの個数を示す。上記の通り、各セルには必ず、右下あるいは左下斜めの壁が置かれる。迷路の入口は上、出口は下。いう条件の下で、入口から出口までの異なる通路は果たして何本あるか。ちなみに、右上の迷路では通路が3本、左下の迷路では通路が1本という結果になっている。上記の左下迷路に対応する入力データは以下の通り。大きくなると、目視での確認は相当きつい。¥は本来はバックスラッシュ\、右下斜めを表しているはずなのに。計算法セル(r,c)に位置することは、そのセルの下の端の中央にいることと考える。すると、周りの壁の形によって、上記の8通りの進み方がある。証明はまだしていないが、入口1箇所に対応する出口は高々1箇所。従って、1つの入口に入って探索していき、出口ひとつに出くわしたら、それ以降の探索は打ち切り、つぎの入口から探索し続ける、という戦略を取って問題なさそう。異なる入口から入り、最終的に同じ出口にいく通路もないと推測する。様々なサイズの長方形(または正方形)の紙Aが与えられている。1枚の紙Aを、折り紙するための4枚の正方形Bに切り分けたいけど、もっとも大きな折り紙Bが得られるような、最適なAがどれかを選べ。以下の実例を見てみる。入力データの終了1枚目の紙10×20では最大5×5の折り紙しか得られない。2枚目の紙40×8では最大8×8の折り紙が得られる。3枚目の紙12×12では最大6×6の折り紙しか得られない。いうことで、2枚目の紙を選べば、最大サイズの折り紙を手にすることができるわけだ。縦幅に比べ、横幅の短くない長方形(または正方形。なければ90°回転すればOK)に対して、最大サイズの折り紙(正方形、同一サイズ)4枚は3通りの並び方にしかならない。小さいほうの値になる。対して入手できる折り紙の最大サイズになる。与えられたすべての紙の中から、最大サイズのものをピックアップすれば、答えが得られる。いうことで、本問題は簡単に解ける。残りは実行時間の短縮ということだ。自分の書いたプログラムは最初0.020秒だったけど、最適化を施し、最終的に0.000秒に到達した。乗算、除算しないで、ビットシフトでの計算を心がけた。4で割り切れるので、実数ではなく、整数だけで計算可能になる。2などと工夫すれば、除算も乗算も必要なくなる。そんなテクニックは実行スピードの本質的な改善に繋がらないから、分からなくても構わないが、少しでも他人よりもランクを上げたい気持ちがあれば、覚えて損することはないだろう。admin2以上の整数nについて、その素因数の和sf(n)の計算法を考える。