티스토리 뷰
https://www.acmicpc.net/problem/16153
16153번: 비트와 가희
첫째 줄에 N(0 ≤ N < 32), A, B(0 < A, B < 231)가 공백으로 구분되어 주어진다. 둘째 줄부터 N개의 각 줄에는 켜져야 하는 bit가 N개 주어진다. 이 값들은 30이하인 음이 아닌 정수이며, 켜져야 하는 bit
www.acmicpc.net
1 이상 B 이하의 정수 중 특정 bit가 set되어있는 A의 배수는 몇 개인지 구하는 문제이다.
Meet In the Middle과 간단한 누적합 DP를 이용하여 구할 수 있다.
B / A가 5천만 이상일 경우, A의 모든 배수를 for문을 돌며 확인하면 시간 내에 통과 가능하다.
A가 특정숫자(128로 가정) 이상인 경우 A의 모든 배수를 for문을 돌며 조건을 만족하는 숫자를 구하고,
A가 특정숫자(128)이하인 경우 meet in the middle + dp를 적용하여 문제를 해결하였다.
[누적합 DP 배열]
DP 배열을 선언한다.
DP[128][1<<16]
DP[i][j]는 다음과 같이 정의한다.
- DP[i][j] : 0~j까지의 숫자 중, A로 나누었을 때의 나머지가 i이며, 주어진 bit가 모두 set되어있는 숫자의 개수.
- ex) set되어야하는 bit가 1, A가 3이라면 DP[2][8] = 2 (2, 5가 해당 조건을 만족한다.)
이와같은 DP배열은 128 * 65536번의 loop로 생성 가능하다.
[meet in the middle]
위에서 누적합 DP배열을 생성하면서 meet in the middle의 한쪽방향을 완성했으므로, 다른쪽 방향도 완성해보자.
직전에 0~15번 bit까지를 다루었으므로, 이번엔 16~30번째 bit까지 다뤄보자.
x를 set되어야하는 상위 15개 bit가 모두 set되었으며, 하위 16bit가 모두 0인 숫자라고 할 때,
DP[ (A - (x % A)) % A ][65535]가 상위 15bit가 x로 고정일 떄, 하위 16bit도 조건을 만족하는 숫자의 개수이다.
x를 1<<16씩 더해가며 결과값을 누적하면 답을 도출할 수 있다.
마지막으로, x가 B의 상위 15bit와 일치하는 경우, DP[ (A - (x % A)) % A ][B의 하위 Bit]를 더해줘야 한다.
설명에서는 총 31bit를 상위 16bit, 하위 15bit로 나누고, 128미만인 A에 대해서만 meet in the middle을 고려하였지만,
16, 15, 128과 같은 상수를 수정하면 좀더 좋은 시간복잡도로 답을 구할 수 있다.
'Problem Solving' 카테고리의 다른 글
boj 1647 : 도시 분할 계획 (0) | 2025.03.11 |
---|---|
boj 1799 : 비숍 (0) | 2025.03.10 |
boj 11001: 김치 (0) | 2022.05.14 |
boj 20193: 화려한 정사각형 (0) | 2022.04.18 |
boj 1214 : 쿨한 물건 구매 (0) | 2021.06.11 |
- Total
- Today
- Yesterday
- 연습문제
- 크루스칼
- 소수 쌍
- 화려한 정사각형
- 16153
- BOJ
- 도시 분할 계획
- 이분매칭
- Rectangles
- 2469
- 백준 1799
- 20193
- 백준 도시 분할 계획
- boj 1799
- 비트와 가희
- 알고리즘
- 백준 1647
- codeground
- SCPC 2016
- 백준알고리즘
- 쿨한 물건 구매
- 같은 탑
- 풀이
- 2차 예선
- 네블컵 2회
- 10159
- scpc
- 백준
- 2016 1차 예선
- 백준 비숍
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |