CafeCoder Test 003
コンテスト日時
2021/05/16 (Su) 14:40 - 16:10

C - たくさんの関数 (Many Functions)

Earlgray
2.5
s
1024
MB
500

問題文

$N$ 個の整数係数一次関数 $f_1(x) = p_1 x + q_1,\ f_2(x) = p_2 x + q_2,...,\ f_N(x) = p_N x + q_N$が与えられます。次の$Q$ 個のクエリに答えてください。
$i$ 番目のクエリでは,整数 $M_i$ が与えられるので、次の条件を満たす長さ $L$ の数列$v_1,\ v_2,\ ...\ v_L$が存在するならば,そのうち$L$ が最小のものを1つ、次の形で出力してください。そのような数列が存在しないとき,:(と出力してください。

$L$
$v_1$ $v_2$ ... $v_L$
  • $v_1,\ v_2,\ ...,\ v_L$ はすべて$1$以上 $N$ 以下の自然数
  • $k=1,\ 2,\ ...,\ L$に対して、順番に $M_i = f_{v_k}(M_i)$ で置き換えるとき、最終的に $M_i$ が$K$ の倍数となる。

制約

  • $1\le N\le 2000$
  • $|p_i|,\ |q_i| \le 10^9$
  • $1\le Q\le 2000$
  • $|M_i|\le 10^{18}$
  • $1\le K \le 5000$
  • 入力はすべて整数である

小課題

  1. (10点) $N\le 5,\ Q = 1$
  2. (20点) $N\le 18,\ Q=1$
  3. (30点) $N\le 100, Q\le 100$
  4. (40点) $Q=1$
  5. (400点) 追加の制約はない。

入力

入力は以下の形式で標準入力から与えられる

$N$
$p_1$ $q_1$
$p_2$ $q_2$
$\vdots$
$p_N$ $q_N$
$Q$ $K$
$M_1$
$M_2$
$\vdots$
$M_Q$

出力

各クエリに対して,問題文の条件を満たす長さ $L$ の数列$v_1,\ v_2,\ ...\ v_L$が存在するならば,そのうち$L$ が最小のものを1つ、次の形で出力して最後に改行してください。そのような数列が存在しないとき,:(と出力してください。

$L$
$v_1$ $v_2$ ... $v_L$
入力例 1
2 6 68 8 30 1 34 6
出力例 1
3 2 1 2

たとえば,$L=3,\ v= ( 2,\ 1,\ 2 ) $ とすると,
$k=0$ のとき,$M=8\times 6 + 30=78$
$k=1$ のとき,$M=6\times 78 + 68 = 536$
$k=2$ のとき,$M=8\times 536 + 30 =4318\ (=34\times 127)$
となり,たしかに $34$ の倍数となります。$L$ を $3$ より小さくすることは出来ないので,これは正解と判定されます。

入力例 2
1 0 18 1 16 -3
出力例 2
:(

条件を満たす数列 ${v}$ は存在しないので,:(を出力します。

入力例 3
1 3 3 1 4 100
出力例 3
0

最初から $M$ は $4$ の倍数なので長さ $L$ が最小になる数列 $v$ は空です。

入力例 4
10 -55019437 -297553174 929223531 -152508926 686273562 -636916832 68461231 629261878 197400983 941125983 -617891647 324928030 960643654 829841649 -450199196 -451011608 285845709 -820570082 -262660355 -870132788 5 93 374919008350420307 -441098967928341545 673009558913052096 655743823569525665 -566516649146560284
出力例 4
3 3 4 10 2 8 1 3 4 4 10 3 3 10 8 3 6 4 10
提出
C++23 (g++ 12.2.0)