Statement
๋ชจ๋ ๊ณ์ฐ์ ์ฒด ์์์ ์ด๋ฃจ์ด์ง๋ค.
๊ธธ์ด๊ฐ ์ธ ๋น๊ณต๊ฐ ๋คํญ์
์ด ์ ํด์ ธ ์๋ค. ํญ์ ์ด๋ค.
์ฐธ๊ฐ์ ํ๋ก๊ทธ๋จ์ ์ ์ฝ๊ณ , ์๋ ๋ช
์ธ๋ฅผ ๋ฐ๋ฅด๋ ์ง์ ํ DSL ํ๋ก๊ทธ๋จ์ ์ถ๋ ฅํด์ผ ํ๋ค. DSL ์คํ์ด ์์๋๋ฉด ๊ธธ์ด๊ฐ ์ธ ๋ฒกํฐ f๊ฐ ๋ฏธ๋ฆฌ ์ ์๋์ด ์์ผ๋ฉฐ, f[i]๋ ๋ฅผ ๋ํ๋ธ๋ค. DSL์๋ ๋ฐ๋ณต๋ฌธ๊ณผ ์กฐ๊ฑด๋ฌธ์ด ์๋ค. ์ฐธ๊ฐ์ ํ๋ก๊ทธ๋จ ์์์๋ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํด๋ ๋์ง๋ง, ํ์ํ DSL ๋ช
๋ น์ ๋ชจ๋ ์ ๊ฐํ์ฌ ์ถ๋ ฅํด์ผ ํ๋ค.
์ถ๋ ฅํ DSL ํ๋ก๊ทธ๋จ์ ๊ธธ์ด๊ฐ ์ธ ๋ฒกํฐ ๋ฅผ ๋ฐํํด์ผ ํ๋ฉฐ, ๋ค์์ ๋ง์กฑํด์ผ ํ๋ค.
์ฑ์ ๊ธฐ๋ ์ ๋ ฅ์ ํฌํจ๋ ๋ถํฌ๋ช ํ ๋ฐ์ดํฐ๋ฅผ ๋น๊ณต๊ฐ ํค๋ก ๋ณต์ํ์ฌ ๋ฅผ ์ป๋๋ค. ์ฐธ๊ฐ์์๊ฒ ๊ณต๊ฐ๋๋ ๋ ผ๋ฆฌ์ ์ ๋ ฅ์ ๋ฟ์ด๋ค. ์ฑ์ ๊ธฐ๋ ์ถ๋ ฅ๋ DSL ํ๋ก๊ทธ๋จ์ ๋ณต์ํ ์ ๋ํด ์ค์ ๋ก ์คํํ๋ค.
DSL ์ ์ฒด ๋ช
์ธ
๋ชจ๋ ๋ ์ง์คํฐ ๊ฐ์ ์์ ์ ํ ๋ฒกํฐ์ด๋ค. ๋ฒกํฐ ์ ๊ธธ์ด๋ ๋ก ํ๊ธฐํ๊ณ , ์ธ๋ฑ์ค๋ ๋ถํฐ ์์ํ๋ค. ๋น ๋ฒกํฐ๋ ํ์ฉ๋๋ค.
๊ฐ ๋ช ๋ น์ ํ ์ค์ ํ๋์ฉ ๋ค์ ํ์์ผ๋ก ์ถ๋ ฅํ๋ค.
OPCODE arg1 arg2 ...
๋ ์ง์คํฐ ์ด๋ฆ์ ์ ๊ท์ [A-Za-z\_][A-Za-z0-9\_]*์ ๋ง์กฑํด์ผ ํ๋ค. ์ ์ ๋ฆฌํฐ๋ด์ ์ญ์ง ํ๊ธฐ์ signed 64-bit ์ ์์ฌ์ผ ํ๋ค. ์ฒด ์์๋ก ์ฐ์ด๋ ๋ฆฌํฐ๋ด์ modulo ์ผ๋ก ์ ๊ทํ๋๋ค.
๊ฒฐ๊ณผ ๋ ์ง์คํฐ dst๊ฐ ์ฒ์ ๋ฑ์ฅํ๋ฉด ์ ๋ ์ง์คํฐ๊ฐ ์ ์๋๋ค. ์ด๋ฏธ ์ ์๋ ๊ฒฝ์ฐ์๋ ๊ธฐ์กด ๊ฐ์ ๋ฎ์ด์ด๋ค. dst๊ฐ ํผ์ฐ์ฐ์์ ๊ฐ์๋ ๋๋ฉฐ, ์ด๋ ๋ชจ๋ ํผ์ฐ์ฐ์๋ ๋ช
๋ น ์คํ ์ ์ ๊ฐ์ ์ฌ์ฉํ๋ค. ๋จ, SCATTER๋ ๊ธฐ์กด dst์ ๋์ ํ๋ค. ์ ์๋์ง ์์ ๋ ์ง์คํฐ๋ฅผ ์ฝ์ผ๋ฉด ์คํ ์ค๋ฅ์ด๋ค.
๋ช ๋ น | ๊ฒฐ๊ณผ ๊ธธ์ด | ์๋ฏธ |
|---|---|---|
| ์์ ๋ฒกํฐ | |
| ๋ฑ์ฐจ์์ด | |
| ๋ฑ๋น์์ด | |
| ๋ฑ๊ฐ๊ฒฉ ์ธ๋ฑ์ค ์ฝ๊ธฐ | |
| ๊ธฐ์กด | ์ง์ ์์น์ ๋์ |
| ์ ๋ํ ๋๋จธ์ง | |
| ๊ณ์๋ณ ๋ง์ | |
| ๊ณ์๋ณ ๋บ์ | |
| ์๋ ๊ท์น | ์์๋ณ ๊ณฑ ๋๋ ์ค์นผ๋ผ๋ฐฐ |
| ์์๋ณ ์ญ์ | |
| NTT | |
| inverse NTT | |
| ๋๋ | full convolution |
| ์์ | ๊ฒฐ๊ณผ ๋ฐํ ํ ์ข ๋ฃ |
CONST
CONST dst value
์ด๋ค.
ARITH
ARITH dst len first diff
์ ์์ด ์๋ ์ ์์ด๋ฉฐ,
์ด๋ค.
GEOM
GEOM dst len first ratio
์ ์์ด ์๋ ์ ์์ด๋ฉฐ,
์ด๋ค.
GATHER
GATHER dst src start step count
๋ ์์ด ์๋ ์ ์์ด๋ค. ์ ์ signed 64-bit ์ ์์ด๋ฉฐ ๋ ํ์ฉ๋๋ค.
์ด๋ค. ์๋ฅผ ๋ค์ด GATHER dst src 0 1 L์ src๋ฅผ ๊ธธ์ด ๋ก ์๋ฅด๊ฑฐ๋ ๋ค์ ์ ๋ถ์ธ๋ค.
SCATTER
SCATTER dst src start step
๋ช
๋ น ์คํ ์ src์ ๊ฐ์ ๋ผ๊ณ ํ ๋,
๋ฅผ ์ํํ๋ค. ๋ชจ๋ ๋ชฉ์ ์ธ๋ฑ์ค๊ฐ ์์ ์์ด์ผ ํ๋ค. ๊ณผ ์ค๋ณต ๋ชฉ์ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ๋ค.
FOLD
FOLD dst src k c
๋ ์์ ์ ์์ด๋ฉฐ,
์ด๋ค. ๋คํญ์ ๊ณ์ ๋ฒกํฐ๋ก ๋ณด๋ฉด ์ด๋ค.
ADD์ SUB
์งง์ ๋ฒกํฐ์ ๋ค๋ฅผ ์ผ๋ก ํ์ฅํ ๋ค ๊ณ์๋ณ๋ก ๋ํ๊ฑฐ๋ ๋บ๋ค.
MUL
MUL dst lhs rhs
๋ค์ ๊ท์น์ ์์๋๋ก ์ ์ฉํ๋ค.
- ์ด๋ฉด ์์๋ณ ๊ณฑ์ ๊ณ์ฐํ๋ค.
- ๊ธธ์ด๊ฐ ๋ค๋ฅด๊ณ ์ด๋ฉด
lhs[0]์ผ๋กrhs๋ฅผ ์ค์นผ๋ผ๋ฐฐํ๋ค. - ๊ธธ์ด๊ฐ ๋ค๋ฅด๊ณ ์ด๋ฉด
rhs[0]์ผ๋กlhs๋ฅผ ์ค์นผ๋ผ๋ฐฐํ๋ค. - ๊ทธ ๋ฐ์ ๊ฒฝ์ฐ ์คํ ์ค๋ฅ์ด๋ค.
MUL์ ๋คํญ์ convolution์ด ์๋๋ค.
INV
INV dst src
src๋ ๋น์ด ์์ง ์์์ผ ํ๊ณ ๋ชจ๋ ์์๊ฐ ์ด ์๋์ด์ผ ํ๋ค. ์ ๊ณ์ฐํ๋ค.
DFT์ IDFT
์ ๋ ฅ ๊ธธ์ด๋ ์ด์ ์ดํ์ธ ์ ๊ฑฐ๋ญ์ ๊ณฑ์ด์ด์ผ ํ๋ค. DFT ๊ฒฐ๊ณผ์ ์ฃผํ์ ์์๋ ๊ณต๊ฐ๋์ง ์๋๋ค. ๋ค์ ์ฑ์ง๋ง ๋ณด์ฅ๋๋ค.
๊ฐ์ ๊ธธ์ด์ ๋ DFT ๊ฒฐ๊ณผ๋ฅผ ์์๋ณ๋ก ๊ณฑํ ๋ค IDFT๋ฅผ ์ ์ฉํ๋ฉด ๊ทธ ๊ธธ์ด์์์ cyclic convolution์ ์ป๋๋ค. ๊ฐ์ ๊ธธ์ด์ ๋ํ ๋ชจ๋ DFT ํธ์ถ์ ๋์ผํ ๋น๊ณต๊ฐ ์์๋ฅผ ์ฌ์ฉํ๋ค.
CONV
CONV dst lhs rhs
ํ ํผ์ฐ์ฐ์๋ผ๋ ๋น ๋ฒกํฐ์ด๋ฉด ๊ฒฐ๊ณผ๋ ๋น ๋ฒกํฐ์ด๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด
์ด๋ค. ํ์ํ ๋ณํ ๊ธธ์ด๊ฐ ์ ์ด๊ณผํ๋ฉด ์คํ ์ค๋ฅ์ด๋ค.
RETURN
RETURN src
src๋ฅผ ๊ฒฐ๊ณผ๋ก ๋ฐํํ๊ณ ์ฆ์ ์คํ์ ์ข
๋ฃํ๋ค. ์ ํํ ํ ๋ฒ ์คํ๋์ด์ผ ํ๋ฉฐ, ๋ฐํ ๋ฒกํฐ์ ๊ธธ์ด๋ ์ด์ด์ผ ํ๋ค. RETURN ๋ค์ ๋ค๋ฅธ ๋ช
๋ น์ด ์์ผ๋ฉด ์คํ ์ค๋ฅ์ด๋ค.
๊ธธ์ด ์ธ DFT ๋๋ IDFT์ ๋น์ฉ์
์ด๋ค. ๋น์ด ์์ง ์์ ๋ ๋ฒกํฐ์ ๋ํ CONV์์ ์ด๋ผ ํ๊ณ , ์ด์์ธ ์ต์์ ์ ๊ฑฐ๋ญ์ ๊ณฑ์ ์ด๋ผ ํ๋ฉด ๋น์ฉ์ ์ด๋ค. ๊ทธ ๋ฐ์ ๋ช
๋ น์ FFT ๋น์ฉ์ ์ด๋ค. ์คํ๋ ๋ช
๋ น์ ๋น์ฉ ํฉ์ ๋ผ ํ๋ค.
์ ์๋์ง ์์ ๋ ์ง์คํฐ ์ฝ๊ธฐ, ์๋ชป๋ ์ธ์ ๊ฐ์๋ ์ ์ ํ์, ์์ ๊ธธ์ด, ์ธ FOLD, ๊ธธ์ด ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋ MUL, ์ ํฌํจํ INV, ์๋ชป๋ DFT ๊ธธ์ด, ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ SCATTER, ์๋ชป๋ RETURN์ ์คํ ์ค๋ฅ์ด๋ค.
์ฑ์
์ฑ์ ๊ธฐ๋ ์๋ก ๋ค๋ฅธ ๋น๊ณต๊ฐ ๋คํญ์์ ๋ํด ํ๋ก๊ทธ๋จ์ ๊ฒ์ฌํ๋ค. ๋ฌธ๋ฒ ์ค๋ฅ, ์คํ ์ค๋ฅ, ์๋ชป๋ ๊ฒฐ๊ณผ, ์๊ฐ ์ ํ ์ด๊ณผ, ๋ฉ๋ชจ๋ฆฌ ์ ํ ์ด๊ณผ ์ค ํ๋๋ผ๋ ๋ฐ์ํ๋ฉด ์ ์๋ ์ ์ด๋ค.
์ธ ๊ฐ ํ ์คํธ์์
๋ก ์ ์ํ๋ค. ์ด๋ฌํ ํ ์คํธ๋ค์ ์ค ์ต๋๊ฐ์ ๋ผ ํ๋ค. ์ต์ข ์ ์๋
์ด๋ค. ์ด๋ฉด ํด๋น ๋น์จ์ ๋ก ํด์ํ๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ํ ์คํธ์์ ์ ํํ๊ณ ์ด๋ฉด ์ ์ ๋ฐ๋๋ค. ์ธ ํ ์คํธ๋ ์ ํ์ฑ๋ง ๊ฒ์ฌํ๋ค.
ํ ์คํธ
์ฒจ๋ถํ์ผ๋ก ์ ๊ณต๋๋ poly_dsl_backend_standalone.hpp๋ฅผ ์ด์ฉํ๋ฉด DSL ๋ช
๋ น์ C++ ํจ์ ํธ์ถ๊ณผ ๋น์ทํ ํํ๋ก ์์ฑํ ์ ์๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์๋ค.
#include <bits/stdc++.h>
#include "poly_dsl_backend_standalone.hpp"
using namespace std;
int main() {
int N;
cin >> N;
READ_INPUT(f, N);
GATHER(f0, f, 0, 1, 1);
INV(g, f0);
RETURN(g);
PRINT_COSTS();
}
๋ณ๋์ ์ปดํ์ผ ํ๋๊ทธ ์์ด ์ปดํ์ผํ์ฌ ์คํํ๋ฉด, ์ ๋ ฅ์ผ๋ก ๋ง ์ฃผ์ด์ก์ ๋ ๋ค์ DSL ํ๋ก๊ทธ๋จ์ ํ์ค ์ถ๋ ฅ์ผ๋ก ์ถ๋ ฅํ๋ค.
GATHER f0 f 0 1 1
INV g f0
RETURN g
์ปดํ์ผํ ๋ -DEXECUTE_DSL ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ๋ฉด DSL ํ๋ก๊ทธ๋จ์ ์ถ๋ ฅํ๋ ๋์ ๊ฐ ๋ช
๋ น์ ์ง์ ์คํํด ๋ณผ ์ ์๋ค.
g++ -std=c++17 -O2 -DEXECUTE_DSL solution.cpp -o solution
์ด ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ์ ์
๋ ฅ์ผ๋ก ์ ์ด์ด ์ ์ฃผ์ด์ผ ํ๋ฉฐ, ํ์ค ์ถ๋ ฅ์๋ RETURN์ผ๋ก ๋ฐํํ ๋ฒกํฐ๊ฐ ์ถ๋ ฅ๋๋ค.
PRINT_COSTS()๋ฅผ ํธ์ถํ๋ฉด ๊ณ์ฐ๋ ๋น์ฉ์ ํ์ค ์ค๋ฅ ์ถ๋ ฅ์์ ํ์ธํ ์ ์๋ค.
FFT_COST = 25165788
AUX_COST = 1114125
์ด ์ค FFT_COST์ ๊ฐ์ด ์ค์ ์ ์ ๊ณ์ฐ์ ์ฌ์ฉ๋๋ค.
์ค์ ์ฑ์ ๊ธฐ์์๋ ์ด ํค๋์ ํฌํจ๋ DSL ๋ช ๋ น์ ๊ตฌํ์ ์ฌ์ฉํ๋ค.
Input
์ ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ ํ์์ผ๋ก ์ฃผ์ด์ง๋ค.
์ ์ฑ์ ๊ธฐ๋ง ํด์ํ๋ ๋ถํฌ๋ช ํ ์ธ์ฝ๋ฉ ๋ฐ์ดํฐ์ด๋ค. ์ฐธ๊ฐ์ ํ๋ก๊ทธ๋จ์ ์ฒซ ๋ฒ์งธ ์ ์ ๋ง ์ฝ์ผ๋ฉด ์ถฉ๋ถํ๋ฉฐ, ๋๋จธ์ง ์ ๋ ฅ์ ๋ฌด์ํด์ผ ํ๋ค. ์ ๋น๊ณต๊ฐ ๊ณ์ ์ฌ์ด์ ๋์์ ๊ณต๊ฐ๋์ง ์๋๋ค.
Output
DSL ๋ช ๋ น์ ํ ์ค์ ํ๋์ฉ ์ถ๋ ฅํ๋ค. ๋ช ๋ น ๊ฐ์๋ฅผ ๋จผ์ ์ถ๋ ฅํ์ง ์๋๋ค. ์ฑ์ ๊ธฐ๋ ์ถ๋ ฅ ํ์ผ์ ๋๊น์ง ์ฝ๋๋ค.
ํ๋ก๊ทธ๋จ์ RETURN์ ์ ํํ ํ ๋ฒ ์คํํด์ผ ํ๋ฉฐ, ๋ฐํ ๋ฒกํฐ์ ๊ธธ์ด๋ ์ด์ด์ผ ํ๋ค. ๊ฐ๋ฅํ DSL ํ๋ก๊ทธ๋จ์ด ์ฌ๋ฌ ๊ฐ์ง๋ผ๋ฉด ์๋ฌด๊ฑฐ๋ ์ถ๋ ฅํด๋ ๋๋ค.
Constraints
- .
- ().
- ๋น๊ณต๊ฐ ๊ณ์๋ ์ ๋ง์กฑํ๊ณ , ์ด๋ค ().
- ์ถ๋ ฅ ํฌ๊ธฐ๋ ์ดํ์ฌ์ผ ํ๋ค.
- ๊ณต๋ฐฑ๋ง ์๋ ์ค์ ์ ์ธํ DSL ๋ช ๋ น์ ๊ฐ ์ดํ์ฌ์ผ ํ๋ค.
- ํ ์ถ๋ ฅ ์ค์ ๊ธธ์ด๋ ๋ฐ์ดํธ ์ดํ์ฌ์ผ ํ๋ค.
- ์๋ก ๋ค๋ฅธ ๋ ์ง์คํฐ๋ ๊ฐ ์ดํ์ฌ์ผ ํ๋ฉฐ, ๋ ์ง์คํฐ ์ด๋ฆ์ ๋ฐ์ดํธ ์ดํ์ฌ์ผ ํ๋ค.
- DSL ์คํ ์ค ๋ ์ง์คํฐ์ ๋ด๋ถ ์์ ๊ณต๊ฐ์ ๋์์ ์ ์ฅ๋๋ ์ฒด ์์ ์๋ ์ดํ์ฌ์ผ ํ๋ค.
Subtasks
Samples
์์๋ ์์ํญ์ ์ญ์ ํ๋๋ง ๋ฐํํ๋ฉด ๋๋ค. ๋ ๋ฒ์งธ ์ ๋ ฅ ๊ฐ์ ์ฑ์ ๊ธฐ์ฉ ๋ถํฌ๋ช ๋ฐ์ดํฐ์ด๋ฏ๋ก ์ฐธ๊ฐ์ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ์ง ์๋๋ค.