最終更新: 2020-07-05T23:55+0900
コンテスト全体については順当に、冴えない結果であ
他が概ね 1000 ms ほどかけているところ、1つだけおよそ半分の 515 ms で済ませている>提出 #14757268。
ル
N/2+1 から N までの数は掛ける2をするだけで N を超えてしまうので、その数自身しか数える必要がない、というあたりかな。ル
こんな手の込んだことをしていながら提出時刻も早くて、Ruby の中では5番目なんだよね。一方の自分は、C 問題で脳死の愚直手続きスクリプトを書いていた>提出 #14743690。脳死のまま清書>提出 #14788308。ステ
D 問題にも最初は脳死状態で挑んでいた。こういうスクリプト。
でもサンプル3が親切にも N の上限値で、このやり方では時間がかかりすぎることに気付かせてくれた。さもなくばずぼらと拙速の代償として TLE を1個拝領していたことだろう。
D 問題。問題と格子点の関連がさ
ところで、この縦に足す方法では、半分から先はどうせ1つしかないのにル
ープを回して一つずつ足してしまう。ここを斜めに足せばル ープは半分で済む。しかしどうせ斜めに足すなら… 左上までし っかり斜めに足す。そうするとル ープの回数はル ートNのオ ーダ ーになる。
画像が見えない(scrapbox も CSS を切らないと読めない)。まだ「斜めに足す
」がわからない。√N のオ
k*(N/k)*(N/k) の、N/k が1になるものだけを特別扱いするのでなく、2になるもの、3になるもの、4、5……で分けると定数係数としてΣの外に出せる(それとΣの区間も変化する)とか、そういう話なんだろうか。いや、どう書いてあるかはざ
しかし明らかにも
自分がやN/k が1になるものだけを特別扱いするのでなく、2になるもの、3になるもの、4、5……で分けると定数係数としてΣの外に出せる
」ということを利用して、k=1..N のル
でもまあ、√N のオ
m=N/k; n=N/(k-1)
なのを利用して 68 ms のスクリプトのルs+=N*(N+1)/2; s+=k*m*(m+1)
と整理できそうなんだけど、そうするとこれまたどこかで見たような式(と定数)でさらに整理できそうな雰囲気があるんだけど、m と n の関係は通分したり約分したりできる関係ではたぶんないんだよね(答えが合わないから)。
図がわかりやすい。オなお、O(N^1/3)の方法もあるらしいです。
」
格子点のやり方がこのオ
じ
まずここから(わかんない)。
1 から n までの約数の個数の総和(つまり、y=n/x の第一象限内の格子点の個数)は などを用いて計算することが多く
傾きが既約分数の場合」)
それというのも Python の方には2桁msの提出が1ペ
※ 実行時間昇順で並べたときだけ自分の 32 ms の提出がリストされない。降順だ
32 ms の1つは自分のだが、28 ms は例えばこれ>提出 #14788253。平均タイムからして明らかに速い。
未だ及ばずながらだいぶ迫
最後に÷4するのにル
これを最適化というのではないか。この問題でしか意味のないル
実は最終版の while ル
Ruby で書くとこんな感じ。
N = gets.to_i p (1..Math.sqrt(N)).sum{|k| n = N/k k*n*(n+1)-k*k*k }
違いを見比べると がル
k*[n*(n+1)-k*k]
からは、何か、意味が読み取れそうな気がするね。数学力があれば見えるんだろうか。数学力があれば意味を保
ル
N = gets.to_i s,k,n = 0,1,N while k<=n s += k*n*(n+1) k += 1 n = N/k end s -= (k*(k-1)/2)**2 p s
※ 両辺の k は異なる。右辺の k が 1,2,3,... の順で繰り返される k として、それに対応して左辺を満たす k が N,N-1,N-2 の順で発見される。1対1対応ではない。