SRM477

インターン中は夜更かしなんてしてられないので、向こう2ヶ月はTopCoderはお預けかな。
なんて思っていたら、オフィス引越しのため2日間暇を出されたところに都合良くSRMが現れました。

250: Islands

  • 六角座標。ものすごく面倒臭そうだ...。
  • ...
  • あれ?六角座標で隣接してるか調べるだけ?
  • 簡単だ。適当に書いてsubmit.
    • 隣接判定をちょっと typo してハマったのはご愛嬌。

500: PythTriplets

  • 数列から (a^2 + b^2 = c^2 and gcd(a, b) == 1) であるような (a, b, c) を disjoint にいくつ取れるか、か。
    • --絶賛問題勘違い中--
  • なんかフローっぽいな。
    • でも a, b, c と3つあると厄介だなぁ。2つなら簡単そうなんだけど...。
    • ...あれ? c の棒だけは材質違うみたいなストーリーがなかったっけ?あれはどう絡んでくるんだろう?
  • (読み直し中)
  • c は数列に無くてもいいのか。なら2部マッチングで大丈夫そう。
    • ...って、どうやって2部グラフにするんだろ?
  • sampleをもっかい見てみる。どのペアも偶数と奇数だ!
    • 偶奇で2部に分けるとかダメかな。ダメだよな。
      • いや、偶数同士でペアにしたら互いに素にならないじゃん。
  • 実装!
  • そういえば、最大流のライブラリどこにやったっけ?
    • 最近無くしちゃったような気がしている。
    • そもそも昨年の夏合宿以来最大流を使った覚えが無い。
    • えーと。どうしよう。
    • って、そもそも夏合宿にはこのPCを持ってったんだから、どっかに眠ってるはずだ。
      • あれは初日のコンテスト終了間際に通したはず。タイムスタンプを見ながら探す。
        • あった。やった。
  • こぴ。ぺ。がりがりがりがり。
  • あ、これ int だとオーバーフローするな。撃墜ケースっと。
  • 書けた。
  • って、あれ?本当に偶奇性で分けていいの?
    • 偶数同士は gcd(a, b) == 2n なのでペアにできない。これはOK.
    • 奇数同士は?ペアにしてもいいんじゃね?
  • ...とりあえず1000ぐらいまで全探索して、(2n+1)^2 + (2m+1)^2 = c^2 => gcd(2n+1, 2m+1) != 1 を確かめてみましょう。
    • そうなってた。ならきっと証明できるはず!
  • 証明は後回しにしてとりあえず submit.
  • あ、そうだ。オーバーフローの撃墜ケースも作らないと。
    • 適当にペアを作れる大きな数を生成してみる。
    • ...作れない。
    • ...作れない。
    • ...作れない。
      • a^2 + b^2 が整数になるような (a, b) って 1,000,000 だと全然見つからないんだなぁ。
    • 500,000 あたりで探してみる。いくつか見つかった。
    • ちゃんと撃墜ケースになってることを確かめたあたりでCoding Phase終了。

Challenge Phase

  • オーバーフローしそうな人を見つけるや否や突撃。
    • +100.00
    • 先を越された人が3人ぐらい。残念だけどまぁいいか。
  • 時間はたっぷり余ってるけど、もう落とせそうに無いので終了。

System Test

  • 500落ちた。残念。
  • oxx +100.00 323.15
  • 1277 -> 1390

500: PythTriplets

  • ソースコードを見直してみた。
  • a^2 + b^2 が平方数かどうかの判定は、あらかじめ i*i (i = 0 ... 1000010) をvectorに突っ込んでおいて、そこから lower_bound で検索するという流れ。
  • ...100010じゃ足りないよ!
  • 増やしてみた。普通に通った。
  • 今思えば、1,000,000 あたりで a^2 + b^2 が平方数となる (a, b) があれだけ探しても一つも見つからないなんておかしいと思うべきだった。
    • 案の定平方数判定の方が間違ってたわけで。
  • それにしても、入念に参加記録を書くと反省点が良く分かるので便利だ。