atcoder#AGC047E. [AGC047E] Product Simulation

[AGC047E] Product Simulation

配点 : 18001800

問題文

これは output-only 問題です。入力は与えられません。

簡潔に述べると、整数の掛け算を、比較 (x<y)(x < y) と加算 (x+y)(x + y) のみを用いてシミュレートする問題です。 入力はありません。操作列の出力のみを行ってください。

長さ NN の長大な配列 a[0],a[1],...,a[N1]a[0], a[1], ..., a[N-1] があるとします。 先頭の二要素の初期値は非負整数 A,BA, B であり (あなたには知らされません)、残りの要素の初期値は 00 です。 あなたの目的は、最終的に a[2]a[2] を積 ABA \cdot B とすることです。

あなたが行えるのは、以下の形式の二種類の操作です (ここで、0i,j,k<N0 \leq i, j, k < N です)。

  • + i j k: a[k]=a[i]+a[j]a[k] = a[i] + a[j] とする。
  • < i j k: a[k]=a[i]<a[j]a[k] = a[i] < a[j] とする。すなわち、a[i]<a[j]a[i] < a[j] であれば a[k]a[k]11 となり、そうでなければ a[k]a[k]00 となる。

操作を行える回数は最大で QQ 回であり、操作中に aa の要素が VV より大きくなってはなりません。 ただし、一回の操作で指定する添字 (i,j,k)(i, j, k) に重複があっても構わず、(先頭二要素を含む) 配列のどの要素も書き換えて構いません。 なお、この問題の正誤判定機は、単一テストケースにおいて実際には複数のペア (A,B)(A, B) について操作列を実行します。 各回について、判定機は値 A,BA, B を選んで配列 a=[A,B,0,0,,0]a = [A, B, 0, 0, \ldots, 0] を生成し、提出された操作列を適用して最終的に a[2]=ABa[2] = A \cdot B となるかを検証します。

制約

  • 0A,B1090 \leq A, B \leq 10^9
  • N=Q=200000N = Q = 200\,000
  • V=1019=10000000000000000000V = 10^{19} = 10\,000\,000\,000\,000\,000\,000

部分点

  • A,B10A, B \leq 10 を満たすテストケースを通過すると、800800 点が与えられる。
  • すべてのテストケースを通過すると、さらに 10001000 点が与えられる。

入力

標準入力から与えられる入力は空である。

出力

11 行目に、操作を行う回数を出力せよ。 続けて、行う操作をそれぞれ + i j k または < i j k という形式で一行に出力せよ。


4
< 0 1 8
+ 0 1 2
+ 2 8 2
+ 0 0 0

入力例 1 では、正誤判定機はペア (A,B)=(2,3)(A, B) = (2, 3) についてのみ提出された操作列を検証します。 上記の出力は、このテストケースを通過します。その過程は次の通りです。

  • はじめ、a[0]=2a[0] = 2, a[1]=3a[1] = 3, a[2]=a[3]==a[N1]=0a[2] = a[3] = \ldots = a[N-1] = 0 である。
  • < 0 1 8 により、a[0]<a[1]a[0] < a[1] であるため a[8]=1a[8] = 1 となる。
  • + 0 1 2 により、a[2]=a[0]+a[1]=5a[2] = a[0] + a[1] = 5 となる。
  • + 2 8 2 により、a[2]=a[2]+a[8]=6a[2] = a[2] + a[8] = 6 となる。
  • + 0 0 0 により、a[0]=a[0]+a[0]=4a[0] = a[0] + a[0] = 4 となる。
  • 要求された通り、最終的に a[2]=6=ABa[2] = 6 = A \cdot B となっている。