BoB005-G: Butter Thief

2 secs 1024 MB
kyaneko999's icon kyaneko999

解説

バター泥棒は,自分が盗むことができるバターのうち美味しさが最も大きいものを盗む代わりに,盗むことができるバターをすべて盗むことにします.
こうすることで,バター泥棒が盗むバターの番号の代わりに,盗むバターの個数を考えれば良いことになります.
(例:レベル 55 のバター泥棒は 44 番目の美味しさ 55 のバターを盗む → レベル 55 のバター泥棒は美味しさ 1,2,3,51,2,3,5 のバター計 44 個を盗む)

f(X)f(X) を以下のように定義すると,答えは f(R)f(L1)f(R)-f(L-1) です.ただし,f(0)=0f(0)=0 とします.

  • f(X)=f(X)= レベル 1,2,,X1,2,\dots,X のバター泥棒が 11 人ずつ現れ Sakky さんを襲うときの盗むバターの個数の総和

f(X)f(X) を求めましょう.「各バター泥棒はどのバターを盗むか」という見方を変えて「各バターはどのバター泥棒に盗まれるか」を考えると,

  • ii 番目のバターは,レベルが FiF_i 以上のバター泥棒に盗まれる

ということが分かります.よって,

  • f(X)=i=110100max(0,XFi+1)f(X)=\displaystyle\sum_{i=1}^{10^{100}}\max(0,X-F_i+1)

が成り立ちます.F78=14472334024676221>1016F_{78}=14472334024676221>10^{16} であることから,\sum を計算する時には i77i\le 77 の範囲のみを考えれば十分です.

解答例(Python)