PS

BOJ 2272 : 램프

lsj_haru 2024. 2. 8. 04:46

알고리즘

bitmasking, ed_hoc

시간복잡도

$O(NlogM)$

풀이

00...01의 전이 상태를 순차적으로 확인해보면,

1세대 때 00...011  
2세대 때 00...0101  
4세대 때 00...010001  
8세대 때 00...0100000001  
...  

임을 확인할 수 있다.

 

즉, 현재의 상태 $a_i$에 대하여 $2^k$세대 이후의 상태는
$a_i ' = a_i + a_{(i + 2^k) \space mod \space N} \space (0 \leq i < N)$이다. 각 전이는 서로에 대해 독립적이므로
$M$을 2의 거듭제곱으로 분해하여 진행하면 된다.

코드

#include <bits/stdc++.h>
using namespace std;

int N, M, a[1000005], b[1000005];

int main()
{
    cin.tie(0)->sync_with_stdio(0);
    cin>>N>>M;
    for (int i = 0; i < N; i++) cin>>a[i];
    for (int bit = 1; bit <= M; bit<<=1) {
        if (!(bit & M)) continue;
        for (int i = 0; i < N; i++) b[i] = (a[i] + a[(i+bit)%N])%2;
        for (int i = 0; i < N; i++) a[i] = b[i];
    }
    for (int i = 0; i < N; i++) cout<<a[i]<<"\n";
}

'PS' 카테고리의 다른 글

BOJ 28327 : 지그재그  (2) 2024.02.20
BOJ 12011 : Splitting the Field  (0) 2024.02.11
BOJ 11993 : Circular Barn (Gold)  (0) 2024.02.08
BOJ 11982 : Angry Cows (Gold)  (1) 2024.02.08
BOJ 3847 : Comparing answers  (2) 2024.02.08