※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 7117번 문제인 Sevens, twos and zeros이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/7117
7117번: Sevens, twos and zeros
The number s as described above must be output on the screen. If it is not possible to find the corresponding value of s to the given value of n, output one word "NAV".
www.acmicpc.net
0, 2, 7의 세 수로 구성할 수 있는 10자리 이하의 수는 (자릿수가 낮은 수는 leading zero가 있다고 취급해 계산하면) 총 \(3^10=59049\)가지만이 존재한다. 또한 모든 20자리 미만의 수는 위의 10자리 수 둘을 이어붙여 구성할 수 있다. 이 성질을 이용해 문제를 해결해보자.
먼저 dfs나 bfs등을 이용해 가능한 모든 10자리 이하 수들을 하나하나 확인해 N으로 나눈 나머지가 k가 되는 수가 존재하는지, 존재한다면 그 최솟값이 무엇인지를 구해두자. 만약 N으로 나누어떨어지는 수가 존재(0을 제외한다. 이는 s가 n 이상이어야 한다는 조건을 만족하지 못한다.)한다면 그 수를 출력해 문제를 해결할 수 있다. 그렇지 않은 경우 가능한 나머지를 기준으로 탐색해 두 10자리 수를 이어붙여 만들 수 있는 수 중 N으로 나누어떨어지는 수의 최솟값을 구해 문제를 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
typedef long long ll;
typedef __int128 lll;
ll cur;
int N; ll rem[500000];
void dfs(int depth) {
int d = cur % N;
if (d == 0) {
if (cur >= N) {
if (rem[0]) rem[0] = min(rem[0], cur);
else rem[0] = cur;
}
}
else {
if (rem[d]) rem[d] = min(rem[d], cur);
else rem[d] = cur;
}
if (depth < 10) {
cur = cur * 10;
dfs(depth + 1);
cur /= 10;
cur = cur * 10 + 2;
dfs(depth + 1);
cur /= 10;
cur = cur * 10 + 7;
dfs(depth + 1);
cur /= 10;
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
dfs(0);
if (rem[0]) cout << rem[0];
else {
lll ans = 0;
for (int i = 0; i < N; i++) {
if (!rem[i]) continue;
int L = (10000000000LL * i) % N;
if (L == 0) {
lll tmp = rem[i];
tmp *= 10000000000LL;
if (ans) ans = min(ans, tmp);
else ans = tmp;
}
else {
int R = N - L;
if (!rem[R]) continue;
lll tmp = rem[i];
tmp *= 10000000000LL;
tmp += rem[R];
if (ans) ans = min(ans, tmp);
else ans = tmp;
}
}
if (ans) {
cout << (ll)(ans / 10000000000LL);
ll val = (ll)(ans % 10000000000LL), digit = 10;
while (val) val /= 10, digit--;
while (digit--) cout << 0;
cout << (ll)(ans % 10000000000LL);
}
else cout << "NAV";
}
}
'BOJ' 카테고리의 다른 글
[BOJ 2799 // C++] 블라인드 (1) | 2024.01.06 |
---|---|
[BOJ 2737 // C++] 연속 합 (1) | 2024.01.05 |
[BOJ 1750 // C++] 서로소의 개수 (1) | 2024.01.03 |
[BOJ 2436 // C++] 공약수 (1) | 2024.01.02 |
[BOJ 4108 // C++] 지뢰찾기 (1) | 2024.01.01 |