DOJ logoDOJ
問題
最近追加された問題保存した問題
カテゴリDLCコンテストグループチーム掲示板
ランキング
正解数ランキングストリークランキングDOJ Powerランキング
提出状況
問題募集ログイン新規登録
DOJ logoDOJ

OI形式のサブタスク採点、Eloレーティング、Discord認証を備えたオンラインジャッジです。

問題
問題一覧カテゴリ
コミュニティ
コンテストランキング掲示板お知らせ外部のコンテストを開催するガイド
アカウント
ログイン新規登録ジャッジ状態
ポリシー
利用規約DLCの利用規則プライバシーAPI 文書言語ランタイムコンテストの順位報酬レーティングとパフォーマンス
© 2026 DOJ
All rights reserved
解説

Déjà vu

問題に戻る

解説

한 부분수열의 f(b)f(b)f(b)에는 모든 원소에서 지수가 같은 소수 거듭제곱만 남는다. 예를 들어 12=22⋅312=2^2\cdot312=22⋅3, 20=22⋅520=2^2\cdot520=22⋅5에서는 222^222만 남겨 f((12,20))=4f((12,20))=4f((12,20))=4를 얻는다.

d∣xd\mid xd∣x이고 gcd⁡(d,x/d)=1\gcd(d,x/d)=1gcd(d,x/d)=1이면 d∥xd\parallel xd∥x라고 쓰자. 즉, 를 소인수분해한 뒤 각 소수 거듭제곱을 통째로 선택하거나 버려서 얻는 약수이다. 라 하고, 각 에 대해 를 구한다. 각 값의 빈도를 세고, 소수 거듭제곱들의 부분집합 곱을 열거하면 된다.

EdE_dEd​를 f(b)=df(b)=df(b)=d인 부분수열의 개수라고 하자. 먼저 Ed=2cd−1E_d=2^{c_d}-1E로 초기화한다. 이후 순서로, 의 모든 약수 , 에 대해 에서 를 뺀다. 정답은

∑d=1AdEd\sum_{d=1}^{A}dE_dd=1∑A​dEd​

이며, 모든 계산은 998 244 353998\,244\,353998244353을 법으로 한다.

최소 소인수와 222의 거듭제곱을 미리 계산하면 한 케이스의 시간 복잡도는 O(N+Alog⁡A)O(N+A\log A)O(N+AlogA), 공간 복잡도는 O(N+A)O(N+A)O(N+A)이다.

증명

소수 ppp의 지수가 eie_iei​인 원소에 ppp를 고르는 연산을 rrr번 적용하면 그 지수는 max⁡(ei이 된다. 지수가 모두 같으면 그대로 남기는 것이 최선이다. 서로 다르면 같은 값이 되기 위해 모두 이 되어야 한다. 따라서 에는 모든 원소에서 지수가 같은 양의 소수 거듭제곱만 남는다.

xx
x
A=max⁡iaiA=\max_i a_iA=maxi​ai​
ddd
cd=#{i:d∥ai}c_d=\#\{i:d\parallel a_i\}cd​=#{i:d∥ai​}
d
​
=
2cd​−
1
x=A,A−1,…,1x=A,A-1,\ldots,1x=A,A−1,…,1
xxx
d∥xd\parallel xd∥x
d<xd<xd<x
EdE_dEd​
ExE_xEx​
−r,0)\max(e_i-r,0)
max(ei​−r,0)
000
f(b)f(b)f(b)

이에 따라 d∥f(b)d\parallel f(b)d∥f(b)일 필요충분조건은 선택한 모든 원소 aia_iai​에서 d∥aid\parallel a_id∥ai​인 것이다. 그러므로

2cd−1=∑x: d∥xEx.2^{c_d}-1=\sum_{x:\,d\parallel x}E_x.2cd​−1=x:d∥x∑​Ex​.

d∥xd\parallel xd∥x이고 d≠xd\ne xd=x이면 d<xd<xd<x이다. 따라서 큰 xxx부터 처리하면 ExE_xEx​가 확정된 상태에서 그 기여를 작은 약수들에서 뺄 수 있다.

열거하는 약수는 일반적인 약수의 일부이므로, 전체 열거 횟수는 ∑d=1A⌊A/d⌋=O(Alog⁡A)\sum_{d=1}^{A}\lfloor A/d\rfloor=O(A\log A)∑d=1A​⌊A/d⌋=O(AlogA) 이하이다.