AtCoder Beginner Contest 326
ย - Last update: 2023-11-14

ABC 326 Upsolving

  • ๋Œ€ํšŒ ์ฐธ๊ฐ€ ์œ ๋ฌด: Y
  • ์ตœ์ข… Performance: 1214 (Rank: 1852 / 11827)
  • Round ๋งํฌ: Top / Tasks
  • ๋ฌธ์ œ๋ณ„ ๊ฒฐ๊ณผ
ABCDEFG
AC
AC
AC
AC
---

A - 2UP3DOWN

์กฐ๊ฑด์— ๋งž๊ฒŒ Takahashi๊ฐ€ ๊ณ„๋‹จ์„ ํƒˆ์ง€ ์—˜๋ฒ ๋ฅผ ํƒˆ์ง€ ๊ฒฐ์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

B - 326-like Numbers

๋ฌธ์ œ์—์„œ ํ•ญ์ƒ ์ด๋Ÿฐ ์ˆซ์ž๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜์—ˆ๋‹ค. ์ฆ๋ช…ํ•˜๋ผ๊ณ  ํ•˜๋ฉด ์‰ฝ์ง€ ์•Š์„ ๋“ฏ.

C - Peak

N์˜ ๋ฒ”์œ„๊ฐ€ Nโ‰ค3ร—105N \le 3 \times 10^5 ์ด๊ณ , ์ˆซ์ž์˜ ๋ฒ”์œ„ Aiโ‰ค109A_i \le 10^9 ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ •๋ ฌ ํ›„ lower_bound๋ฅผ ํ†ตํ•ด ์ ์ ˆํ•œ ๊ตฌ๊ฐ„ (x,x+M)(x, x + M)์•ˆ์— ์†ํ•œ ์›์†Œ๋“ค์˜ ์ˆ˜๋ฅผ ๊ตฌํ•ด์ฃผ๋ฉด ๋˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. ๋งŒ์•ฝ ์ˆซ์ž์˜ ๋ฒ”์œ„๊ฐ€ ์ž‘๋‹ค๋ฉด ์™„ํƒ์ด ์˜คํžˆ๋ ค ๋น ๋ฅผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ด ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ์—๋Š” ์•„๋‹ˆ์—ˆ๋‹ค.

D - ABC Puzzle

์กฐ๊ธˆ ๊นŒ๋‹ค๋กœ์šด ์กฐ๊ฑด์˜ ๋ฌธ์ œ์˜€๋‹ค. ๊ฐ€์ง€์น˜๊ธฐ dfs๋กœ ์ ‘๊ทผํ–ˆ๋Š”๋ฐ ํ’€์ด๊ฐ€ ๋‡Œ์ ˆ์˜ ๋‡Œ์ ˆ์„ ๊ฑฐ๋“ญํ•œ ๊ฐ€์šด๋ฐ ์ข…๋ฃŒ 5๋ถ„์ „์— ์ œ์ถœ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋•๋ถ„์— ๋‹ค๋ฅธ ๋ฌธ์ œ๋“ค๋„ ํ’€๋งŒํ•œ ๊ฒƒ๋“ค์ด์—ˆ๋Š”๋ฐ ํ’€ ์‹œ๊ฐ„์ด ์—†์—ˆ๋‹ค..

์ฒ˜์Œ์— dfs๋ฅผ 2๊ฐœ๋กœ ๋‚˜๋ˆ„์–ด ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์˜คํžˆ๋ ค ํŒจ์ฐฉ์ด์—ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์กฐ๊ฑด์œผ๋กœ ํ‘ธ๋Š”๊ฒŒ ํ•ญ์ƒ ์˜ณ๋‹ค. ๊ทธ๋ƒฅ xx -> x+1x + 1๋กœ ์ „์ด ์‹œํ‚ค๊ณ , xx == Nโˆ’1N - 1์ด ๋  ๋•Œ ๋‹ค์Œ row๋กœ ๊ฐ€๊ฒŒ ํ•˜๋Š” dfs๊ฐ€ ์œ ํšจํ–ˆ๋‹ค. ๋‹ค์Œ์—๋Š” ์ด๋Ÿฐ ์œ ํ˜• ๋‚˜์˜ฌ ๋•Œ ๋„ˆ๋ฌด ์–ด๋ ต๊ฒŒ ์ ‘๊ทผํ•˜์ง€ ๋ง์ž..

E - Revenge of "The Salary of AtCoder Inc." (Solved with Editorial)

๊ธฐ๋Œ“๊ฐ’ DP ์œ ํ˜• ์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋ฌธ์ œ ๋‚ด์—์„œ Modular Inverse๋„ ์š”๊ตฌํ•˜๋Š” ๋“ฑ ์ƒ๋‹นํžˆ ๋ฐฑ์ค€์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ ‘ํ•˜๊ธฐ๋Š” ์–ด๋ ค์šด ์œ ํ˜•์ด๋‹ค. ์—๋””ํ† ๋ฆฌ์–ผ์„ ๋ณด๊ณ  ํ’€์ด๋ฅผ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.

์šฐ์„ , ๊ธฐ๋Œ“๊ฐ’์„ ๋ฐ”๋กœ ๊ตฌํ•˜๊ธฐ์—๋Š” ๋‚œ์ด๋„๊ฐ€ ์žˆ๋‹ค. ๊ธฐ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๊ธฐ ์ด์ „์—, ํ™•๋ฅ ์„ ๋จผ์ € ๊ตฌํ•ด๋ณด๋„๋ก ํ•˜์ž. pip_i๋ฅผ AiA_i์—”์ด ์ง€๊ธ‰๋˜์—ˆ์„ ๋•Œ์˜ ํ™•๋ฅ ์ด๋ผ๊ณ  ํ•˜์ž. ํŽธ์˜์ƒ p0=1p_0 = 1๋กœ ์ •์˜ํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด, ๋‹ค์Œ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

  • pi=1Nโˆ‘j=0iโˆ’1pjp_i = \displaystyle \frac 1 N \sum_{j=0}^{i-1} p_j

์œ„ ์ˆ˜์‹์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒ๊ฐํ•˜๊ธฐ ์–ด๋ ต๋‹ค. small to large ํ•ด๋ณด์ž. ๋งŒ์•ฝ N=1N = 1 ์ด๋ผ๋ฉด ์ž๋ช…ํ•˜๊ฒŒ p1=1p_1 = 1์ด๋‹ค. N=2N = 2๋ผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

  • p1=12(1)=12p_1 = \displaystyle \frac 1 2 (1) = \frac 1 2 ... ์ฒ˜์Œ ์ฃผ์‚ฌ์œ„๋ฅผ ๋˜์ ธ์„œ 1์ด ๋‚˜์™”์„ ํ™•๋ฅ 
  • p2=12(1+12)=34p_2 = \displaystyle \frac 1 2 (1 + \frac 1 2) = \frac 3 4 ... (์ฒ˜์Œ์— 2๊ฐ€ ๋ฐ”๋กœ ๋‚˜์™”์„ ํ™•๋ฅ ) + (์ฒ˜์Œ ์ฃผ์‚ฌ์œ„๋ฅผ ๋˜์ ธ์„œ 1, ๊ทธ๋‹ค์Œ 2๊ฐ€ ๋‚˜์™”์„ ํ™•๋ฅ )

๋ชจ๋“  ํ™•๋ฅ ์˜ ํ•ฉ์ด 11์ด ๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ํ•ด์„œ ๋‹นํ™ฉํ•  ํ•„์š”๋Š” ์—†๋‹ค. ์ง€๊ธˆ ๋ชจ๋“  ํ™•๋ฅ ์ด ๋…๋ฆฝ์ธ ๊ฒฝ์šฐ๋ฅผ ๋‹ค๋ฃจ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. pip_i๋ฅผ AiA_i์—”์ด ์ง€๊ธ‰๋˜์—ˆ์„ ๋•Œ์˜ ํ™•๋ฅ ์ด๋ผ๊ณ  ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค. (์‹ค์ œ ๊ธฐ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๊ธฐ ์šฉ์ดํ•˜๋„๋ก) N=3N = 3์ธ ๊ฒฝ์šฐ๋ฅผ ํ•œ๋ฒˆ ๋” ์ƒ๊ฐํ•ด๋ณด์ž.

  • p1=13(1)=13p_1 = \displaystyle \frac 1 3 (1) = \frac 1 3
  • p2=13(1+13)=49p_2 = \displaystyle \frac 1 3 (1 + \frac 1 3) = \frac 4 9
  • p2=13(1+13+49)=1627p_2 = \displaystyle \frac 1 3 (1 + \frac 1 3 + \frac 4 9) = \frac {16} {27}

์—ฌ๊ธฐ์„œ 13\frac 1 3์€ ํ˜„์žฌ pip_i๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ ํ™•๋ฅ , ๊ทธ๋ฆฌ๊ณ  ๊ด„ํ˜ธ ์•ˆ์— ๋“ค์–ด๊ฐ„ ์ˆซ์ž๋“ค์˜ ํ•ฉ์€ ๊ทธ ์ „ ๋ˆˆ๊ธˆ๋“ค์— ๊ฐ€ ์žˆ๋Š” ์ƒํƒœ๋“ค์˜ ํ•ฉ์ด๋‹ค. ์ˆ˜์‹์ด ์–ด๋ ค์šธ ๋ฟ DP ์ƒํƒœ์ „์ด๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ธ ํ‘œํ˜„์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ์œ„ ์ˆ˜์‹์€ ๋ˆ„์ ํ•ฉ์„ ํ™œ์šฉํ•ด O(N)O(N)์— ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ œ์—์„œ ์ตœ์ข…์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์€ ๊ธฐ๋Œ“๊ฐ’์ด๊ณ , ๊ธฐ๋Œ“๊ฐ’์€ ์ •์˜์— ์˜ํ•ด ์•„๋ž˜์ฒ˜๋Ÿผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • E[X]=โˆ‘i=1NxipiE[X] = \displaystyle \sum_{i=1}^{N} x_ip_i

์œ„ ์‚ฌ์‹ค๋“ค์„ ์กฐํ•ฉํ•˜๊ณ , Modular Inverse๋ฅผ ์ด์šฉํ•ด ์ตœ์ข…์ ์ธ ๋‹ต์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์ œ์—์„œ ๋‚˜์˜จ 998244353998244353 ๋ผ๋Š” ์ˆ˜๋Š” AtCoder์—์„œ ์ข‹์•„ํ•˜๋Š” ์†Œ์ˆ˜์ธ ๋“ฏ ํ•˜๋‹ค. ์ด ์ฒด ์—์„œ 1N\displaystyle \frac 1 N์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. getInv(N) ์œผ๋กœ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.

ll fastPow(ll a, ll p) {
ll res = 1LL;
while (p) {
if (p & 1LL) res = res * a % MOD;
a = a * a % MOD;
p >>= 1LL;
}
return res;
}
ll getInv(ll v) {
return fastPow(v, MOD - 2);
}

F - Robot Rotation (Upsolved)

Nโ‰ค80N \le 80 ์กฐ๊ฑด์—์„œ MITM์˜ ๋ƒ„์ƒˆ๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ๋А๊ผˆ์ง€๋งŒ, ํ™•์‹ ์€ ์—†์—ˆ๋‹ค. ๋ฐฉํ–ฅ์ด 2๋ฐฉํ–ฅ์ด๋ผ ์–‘๋ฐฉํ–ฅ์—์„œ ์ถœ๋ฐœํ•˜๋ฉด ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ 2402^{40} ์ด๊ณ  ์ด๋Š” ๊ฝค ํฐ ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ.. ์ด ํ’€์ด๊ฐ€ ์œ ํšจํ•œ์ง€ ํ•œ๋ฒˆ ๋„์ „ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. (์•„๋‹ˆ๋ฉด ์–ด์ฉ” ์ˆ˜ ์—†๊ณ ..)

๊ด€์ฐฐํ•ด๋ณด๋ฉด, ์šฐ์„  ์ฒ˜์Œ ๋กœ๋ด‡์˜ ๋ฐฉํ–ฅ์˜ ์–‘์˜ x์ถ•์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  90๋„์”ฉ๋งŒ ์ขŒ์šฐ๋กœ ํšŒ์ „์„ ํ•˜๋ฏ€๋กœ, ii๊ฐ€ ํ™€์ˆ˜์ธ ํ•ญ์€ yy์ขŒํ‘œ๋ฅผ, ii๊ฐ€ ์ง์ˆ˜์ธ ํ•ญ์€ xx ์ขŒํ‘œ๋ฅผ ๊ฒฐ์ •์ง“๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋จผ์ € ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์šฐ์„  ๊ฐ ์ถ•์œผ๋กœ์˜ ์ขŒํ‘œ๊ฐ€ 2402^{40}์œผ๋กœ ์ค„์–ด๋“ ๋‹ค. ์ด ์ƒํƒœ์—์„œ MITM์„ ์ ์šฉํ•˜๋ฉด 2202^{20} ์ •๋„์— ํ’€ ์ˆ˜ ์žˆ๊ณ  ์ด๋Š” ํ•ด๋ณผ๋งŒ ํ•˜๋‹ค. ๋„์ฐฉ ์ขŒํ‘œ๋ฅผ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์›์ ๊ณผ, ๋„์ฐฉ ์ขŒํ‘œ ์–‘์ชฝ์—์„œ MITM์„ ์ ์šฉํ•˜๋ฉด ํ’€๋ฆฐ๋‹ค.

...๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ๊นŒ์ง€ ํ•˜๊ณ  ๋๋‚ด๋ฉด ์‚ฌ์‹ค

5
์ •๋„์˜ ๋‚œ์ด๋„์ผ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์— ๋ฌธ์ œ๋Š” ๊ฒฝ๋กœ ๋ณต์› ๊นŒ์ง€ ์š”๊ตฌํ•œ๋‹ค. MITM์„ ํ•˜๋ฉด์„œ, ๋„๋‹ฌํ•œ ๊ฒฝ๋กœ๋ฅผ ์ž˜ ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ๋ณต์›ํ•ด์ค˜์•ผ ํ•˜๋Š” ๋กœ์ง์ด ์ถ”๊ฐ€๋œ๋‹ค.

๋‹ค์†Œ ๋ณต์žกํ•œ MITM์ด๊ณ , ์•„๋ž˜์— ํ’€์ด๋ฅผ ์ •๋ฆฌํ•ด๋‘”๋‹ค. ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(N2N/4)O(N 2^{N/4}) ์ด ๋œ๋‹ค. (๋‚ด ์‹ค์ œ ํ’€์ด๋Š” ๋กœ๊ทธ๊ฐ€ ํ•˜๋‚˜ ๋” ๋ถ™๊ธดํ•˜๋Š”๋ฐ ๋Œ€์„ธ์— ์ง€์žฅ์€ ์—†๋‹ค)

๐Ÿ‘‰ ํŽผ์น˜๊ธฐ
ll N, X, Y;
void solve() {
scanf("%lld %lld %lld", &N, &X, &Y);
vector<ll> dx, dy;
for(int i = 0; i < N; ++i) {
ll tmp; scanf("%lld", &tmp);
if (i % 2 == 0) {
dy.push_back(tmp);
} else {
dx.push_back(tmp);
}
}
int dxsz1 = dx.size() / 2;
int dysz1 = dy.size() / 2;
int dxsz2 = dx.size() - dxsz1;
int dysz2 = dy.size() - dysz1;
// 1. ์›์ ์—์„œ ์ถœ๋ฐœํ•˜๊ธฐ
map<ll, int> px, py;
int end = 1 << dxsz1;
for(int cur = 0; cur < end; ++cur) { // ์„ ํƒ๋œ ์ขŒํ‘œ๋“ค
ll cx = 0;
for(int i = 0, p = 1; i < dxsz1; ++i, p <<= 1) {
if (cur & p) {
cx += dx[i];
} else {
cx -= dx[i];
}
}
px.insert({cx, cur});
}
end = 1 << dysz1;
for(int cur = 0; cur < end; ++cur) { // ์„ ํƒ๋œ ์ขŒํ‘œ๋“ค
ll cy = 0;
for(int i = 0, p = 1; i < dysz1; ++i, p <<= 1) {
if (cur & p) {
cy += dy[i];
} else {
cy -= dy[i];
}
}
py.insert({cy, cur});
}
// 2. ๋’ค์—์„œ ์ถœ๋ฐœํ•˜๊ธฐ
end = 1 << dxsz2;
bool xflag = false;
int x1, x2;
for(int cur = 0; cur < end; ++cur) { // ์„ ํƒ๋œ ์ขŒํ‘œ๋“ค
ll cx = X;
for(int i = 0, p = 1; i < dxsz2; ++i, p <<= 1) {
if (cur & p) {
cx -= dx[dxsz1 + i];
} else {
cx += dx[dxsz1 + i];
}
}
if (px.find(cx) != px.end()) {
xflag = true;
x1 = px[cx];
x2 = cur;
break;
}
}
end = 1 << dysz2;
bool yflag = false;
int y1, y2;
for(int cur = 0; cur < end; ++cur) { // ์„ ํƒ๋œ ์ขŒํ‘œ๋“ค
ll cy = Y;
for(int i = 0, p = 1; i < dysz2; ++i, p <<= 1) {
if (cur & p) {
cy -= dy[dysz1 + i];
} else {
cy += dy[dysz1 + i];
}
}
if (py.find(cy) != py.end()) {
yflag = true;
y1 = py[cy];
y2 = cur;
break;
}
}
if (xflag && yflag) {
printf("Yes\n");
// x1: 2์ง„์ˆ˜, dxsz1
// x2: 2์ง„์ˆ˜, dxsz2, ๊ฑฐ๊พธ๋กœ
vector<int> x, y;
for(int i = 0, p = 1; i < dxsz1; ++i, p <<= 1) {
if (p & x1) x.push_back(1);
else x.push_back(-1);
}
for(int i = 0, p = 1; i < dysz1; ++i, p <<= 1) {
if (p & y1) y.push_back(1);
else y.push_back(-1);
}
for(int i = 0, p = 1; i < dxsz2; ++i, p <<= 1) {
if (p & x2) x.push_back(1);
else x.push_back(-1);
}
for(int i = 0, p = 1; i < dysz2; ++i, p <<= 1) {
if (p & y2) y.push_back(1);
else y.push_back(-1);
}
_D("X: ");
for(auto& item: x) _D("%d ", item);
_D("\n");
_D("Y: ");
for(auto& item: y) _D("%d ", item);
_D("\n");
int last = 1;
string ans = "";
bool isY = true;
int cy = 0, cx = 0;
for(int i = 0; i < N; ++i) {
if (isY) {
// y
if (last > 0 && y[cy] > 0) { ans += "L"; last = 1; }
else if (last > 0 && y[cy] < 0) { ans += "R"; last = -1; }
else if (last < 0 && y[cy] > 0) { ans += "R"; last = 1; }
else if (last < 0 && y[cy] < 0) { ans += "L"; last = -1; }
++cy;
isY = false;
} else {
// x
if (last > 0 && x[cx] > 0) { ans += "R"; last = 1; }
else if (last > 0 && x[cx] < 0) { ans += "L"; last = -1; }
else if (last < 0 && x[cx] > 0) { ans += "L"; last = 1; }
else if (last < 0 && x[cx] < 0) { ans += "R"; last = -1; }
++cx;
isY = true;
}
}
printf("%s\n", ans.c_str());
} else {
printf("No\n");
}
}

G - Unlock Achievement (To be Upsolved?)

Editorial์„ ๋ณด๋‹ˆ ์œ ๋Ÿ‰ ๋ฌธ์ œ๋ผ๊ณ  ํ•œ๋‹ค. Upsolving์„ ํ•ด๋ณผ๊นŒ..?

๐Ÿท๏ธ ์ฃผ์ œ ๋ชฉ๋ก: