Monoxer Programming Contest for Engineers
コンテスト日時
2025/08/08 (Fr) 18:30 - 20:10

J - 三人寄れば

Earlgray
2
s
1024
MB
600

問題文

株式会社モンクサには $N$ 人の社員がおり、それぞれの社員には強さ $A_i$ が定まっています。この中から 3 人選んでチームを作りたいです。そのようなやり方は $C(N, 3)$ 通りありますが、それぞれに対して強さの合計を求め、集計してください。最終的に強さの合計に対してそれを満たすチームの選び方が何通りあるかを $998244353$ で割ったあまりを出力してください。

制約

  • $3 \le N \le 5 \times 10^5$
  • $1 \le A_i \le 10^5$
  • 入力はすべて整数である。

入力

$N$
$A_1$ $A_2$ $\cdots$ $A_N$

出力

$S_1$ $T_1$
$\vdots$
$S_k$ $T_k$

強さの合計が $x$ であるチーム分けの総数を $998244353$ で割ったあまりを $B_x$ とする。$B_x \neq 0$ であるような $x$ を昇順に $S_1, \ldots, S_k$ としたとき、 $S_i = x$ ならば $T_i = A_x$ となるようにせよ。
入力例 1
5 3 1 4 1 5
出力例 1
5 1 6 1 7 1 8 2 9 2 10 2 12 1

例えば強さの合計が 10 であるチームを選出する方法には以下のようなものがあります。

  • 社員 2, 3, 5 を選ぶ。強さの合計は $1 + 4 + 5 = 10$ である。

他にも強さの合計が 10 であるチームを選出する方法はあり、合計 2 通りあります。

入力例 2
3 2 3 4
出力例 2
9 1
入力例 3
10 83 12 98 151 163 12 12 98 101 123
出力例 3
36 1 107 3 122 6 125 3 147 3 175 3 187 3 193 6 196 3 208 3 211 6 218 3 233 6 236 3 246 3 258 3 261 6 264 3 273 6 276 3 279 1 282 2 286 3 297 1 298 3 304 2 307 1 319 1 322 2 326 3 332 2 335 1 344 2 347 2 350 2 357 1 359 1 362 2 369 1 372 2 375 1 384 2 387 1 397 1 412 2 415 1 437 1
提出
C++23 (g++ 12.2.0)