※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 1323번 문제인 숫자 연결하기이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/1323

 

1323번: 숫자 연결하기

첫째 줄에 N과 K가 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다. K는 100,000보다 작거나 같은 자연수이다.

www.acmicpc.net

K로 나눈 나머지가 같은 두 수 x와 y에 대하여 이 두 수 뒤에 양의 정수 N을 이어붙여 만든 수 또한 K로 나눈 나머지가 같다는 점을 확인하자.

 

위의 성질과 K가 10만 이하인 점을 이용하면 숫자를 많아야 10만번 뒤로 잇는 것을 시뮬레이션해보는 것으로 문제를 충분히 해결할 수 있음을 알 수 있다. (비둘기집의 원리, pigeonhole principle)

 

매우 긴 정수를 저장해 계산하는 것은 효율적이지 못하므로 각 수를 K로 나눈 나머지를 계속 저장해나가는 것으로 문제를 해결하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;
typedef long long ll;

ll N, NN, K, cur;
ll e10 = 1;
bool visited[100000];
int ans = 0;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N >> K; NN = N;
	while (NN) NN /= 10, e10 *= 10;
	while (!visited[cur]) {
		visited[cur] = 1;
		cur = (cur * e10 + N) % K;
		ans++;
		if (cur == 0) {
			cout << ans;
			return 0;
		}
	}

	cout << -1;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 1322 // C++] X와 K  (0) 2023.07.31
[BOJ 1334 // C++] 다음 팰린드롬 수  (0) 2023.07.30
[BOJ 26937 // C++] Köpa Böcker  (0) 2023.07.28
[BOJ 26763 // C++] Liczby silne  (0) 2023.07.27
[BOJ 26748 // C++] Antypalindrom  (0) 2023.07.26

+ Recent posts