283.1
結構いいセットのような気がする。600>>>1000なのはさておき。関係ないけどフォントがおかしいのでスタイル作るか...。
300
N個の点がある状況で、できるだけ多くの点が距離D以内にあるような直線を引くとき、その点数を答えよ、という問題。直線は任意の位置を通るが、傾きは45度か90度のみ。
すべての点について、-Dと+Dで区間グラフを作り、一番重なりが多い所を求める。(45度傾いた直線だと区間の幅はルート2倍になる。)
600
整数列AとMが与えられるので、A[0]!^(A[1]!^(....))%Mの値を求めよ、という問題。
A%Mがループすることを利用する。小さい範囲ではループしなかったりするので、明らかにその範囲にないことを確認すれば、再帰的に適用できる。その範囲にある場合には小さい値なので計算できる。なお、A[i]が1または0ならばそれ以降は見ないで問題ない。(見ると挙動がおかしくなった。)
綺麗にサックリ書ける気がしない。
1000
禁止文字列がいくつか提示されるので、それを含むようなN文字以下の文字列は何通りあるか答えよ、という問題。
取り敢えず禁止文字列のうち、他の禁止文字列を含むものは無視する。(その文字列にマッチするときには、もう一方が必ずマッチしているので。)このとき同一の文字列があることに注意する。
後は禁止文字列群の接頭辞集合を状態として、状態遷移行列を作成する。終了状態からは外に出ないようにして、後は行列乗算を行うだけ。
すっきり綺麗に書ければ簡単なのだけれども...。