[0][0]=0【python】

注意

はてなブログの仕様のため、タイトルはわざと全角文字にしています。

概要

タイトルの通り、pythonで「[0][0]」と入力すると0を出力する。

f:id:shakayami:20220101172302p:plain

これは、[0]という長さ1の配列の0番目の値*1を出力するという意味なのでそうなる。

さらに、[[0][0]][[0][0]]も0になる。同様のノリで再帰的な構造を考えることができる

よって、

 

gist.github.com

というコードを書くと、


0 [0][0] [[0][0]][[0][0]] [[[0][0]][[0][0]]][[[0][0]][[0][0]]] [[[[0][0]][[0][0]]][[[0][0]][[0][0]]]][[[[0][0]][[0][0]]][[[0][0]][[0][0]]]] [[[[[0][0]][[0][0]]][[[0][0]][[0][0]]]][[[[0][0]][[0][0]]][[[0][0]][[0][0]]]]][[[[[0][0]][[0][0]]][[[0][0]][[0][0]]]][[[[0][0]][[0][0]]][[[0][0]][[0][0]]]]] [[[[[[0][0]][[0][0]]][[[0][0]][[0][0]]]][[[[0][0]][[0][0]]][[[0][0]][[0][0]]]]][[[[[0][0]][[0][0]]][[[0][0]][[0][0]]]][[[[0][0]][[0][0]]][[[0][0]][[0][0]]]]]][[[[[[0][0]][[0][0]]][[[0][0]][[0][0]]]][[[[0][0]][[0][0]]][[[0][0]][[0][0]]]]][[[[[0][0]][[0][0]]][[[0][0]][[0][0]]]][[[[0][0]][[0][0]]][[[0][0]][[0][0]]]]]] [[[[[[[0][0]][[0][0]]][[[0][0]][[0][0]]]][[[[0][0]][[0][0]]][[[0][0]][[0][0]]]]][[[[[0][0]][[0][0]]][[[0][0]][[0][0]]]][[[[0][0]][[0][0]]][[[0][0]][[0][0]]]]]][[[[[[0][0]][[0][0]]][[[0][0]][[0][0]]]][[[[0][0]][[0][0]]][[[0][0]][[0][0]]]]][[[[[0][0]][[0][0]]][[[0][0]][[0][0]]]][[[[0][0]][[0][0]]][[[0][0]][[0][0]]]]]]][[[[[[[0][0]][[0][0]]][[[0][0]][[0][0]]]][[[[0][0]][[0][0]]][[[0][0]][[0][0]]]]][[[[[0][0]][[0][0]]][[[0][0]][[0][0]]]][[[[0][0]][[0][0]]][[[0][0]][[0][0]]]]]][[[[[[0][0]][[0][0]]][[[0][0]][[0][0]]]][[[[0][0]][[0][0]]][[[0][0]][[0][0]]]]][[[[[0][0]][[0][0]]][[[0][0]][[0][0]]]][[[[0][0]][[0][0]]]
[[[0][0]][[0][0]]]]]]]

となる。

 

つまり、以下のように定義される

文字列$\{S_n\}_{n=0}^{\infty}$において、

$S_0=''0''$

$S_{n+1}=''[''\quad+\quad S_{n}\quad+\quad ''][''\quad+ \quad S_{n}\quad+\quad '']''\quad(n\geq 0)$

 

このとき、$n$番目の列の長さは、$|S_0|=1,|S_{n+1}|=2|S_n|+4$を解けばよいため、

$$|S_n|=5\cdot 2^n-4$$

となる。

 

問題

$S_n$の先頭$m $文字の中に含まれている$''['',''0'','']''$の数をそれぞれ求めよ

 

制約

$0\leq n\leq 30000$

$0\leq m\leq \min\{5\cdot 2^n-4,10^{18}\}$

 

サンプル

n=30000

m=10^18のとき

400000000000017993 199999999999994012 399999999999987995

 

答えを$f:\mathbb{N}^2\to\mathbb{N}^3$とする。

また、$L_n=5\cdot 2^n-4$とする。

このとき、簡単な例から考えると、

$$f(0,0)=(0,0,0),f(0,1)=(0,1,0)$$

また、

$$f(n+1,L_{n+1})=(2,0,2)+2f(n,L_n)$$

より、

$$f(n,L_n)=(2^{n+1}-2,2^n,2^{n+1}-2)$$

となる。

$m\lt L_n$の場合は、$m\lt\dfrac{L_n}{2}$か$m\geq \dfrac{L_n}{2}$かで場合分けすればよい。

どちらの場合にせよ、$n\to n-1$とした場合の結果を流用すればOKである。

 

最終的にコードは以下のようになる。

gist.github.com

 

計算量は考えてないけど、とりあえず上記の制約の場合手元では2秒以内に終了した。

問題の類題(ネタバレ注意)

 

 

 

 

 

 

atcoder.jp

*1:pythonでは配列は0-indexedなので、最初から0番目、1番目、2番目、…となる。