競プロ備忘録

競プロerの備忘録

ABC96D - Five, Five Everywhere (ネタ解法)

ネタ解法。理論的な根拠は一ミリもないので閲覧注意。

解法

55個しか出力しなくていいなら、埋め込みがしたくなる。事実、任意の5個の値の和が合成数であるような55項の数列から適当にN個選んできて新しく数列を作っても条件は満たすので、N=55のときの解を計算量度外視で求めて、埋め込めばACがもらえる。

でどうやってそれを求めるかだが、とりあえず55555以下の素数からランダムに5個選んできて、その和が素数になるのってどれくらいの割合でやってくるの?ということが気になる。
理論で求めることは私にはできないのでコードを書いて試してみると、感覚的には全然やってこない。

だったら、とりあえずN=5の答えを求める。その後はランダムに値をとってきて、条件を満たせばpush、満たさないなら無視、ということを繰り返せば、そのうちN=55に到達するんじゃないか?ということを試してみたくなる。

実際、これはやってみると案外高速に答えが出てきた。というわけで、一応数列が条件を満たしているかのassertを入れて、埋め込んだ数列からN個適当に出力することでACがもらえる。

こんなネタ解法なので、計算量は不明。もしかしたらちゃんと導出できるかもしれないけど、私には無理。
いや、埋め込んで出力するだけなので、出力がネックになって O(N)、とは言えるかもしれない…

一応ACコード

Submission #38739180 - AtCoder Beginner Contest 096