알고리즘/백준 알고리즘

[BOJ] 3944 나머지 계산

문제 링크

 

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

 

모든 알고리즘 문제는 C++로 구현되어 있습니다.

 

 

이 문제는 입력받은 모든 자릿수를 더하고, 이를 b-1로 나눈 나머지를 구하면 답을 구할 수 있다. 자세한 식 도출 과정은 다음과 같다.

 

 

123456(7) mod 6을 예로 들어보자.

123456(7)을 10진수로 변환하면

 

1 * 7^5 + 2 * 7^4 + 3 * 7^3 + 4 * 7^2 + 5 * 7^1 + 6 * 7^0

 

이다. 이 수에 mod 6을 하면 모듈러 연산의 분배법칙을 이용하여

 

(1 * 7^5) mod 6 + (2 * 7^4) mod 6 + (3 * 7^3) mod 6 + (4 * 7^2) mod 6 + (5 * 7^1) mod 6 + (6 * 7^0) mod 6

 

으로 바꿀 수 있다.  (1 * 7^5) mod6 만 따로 살펴보자.

 

1*7^5 = (1*7*7*7*7*7) mod 6 = 1 mod 6 * (7 mod 6) * 5 = 1 mod 6

 

이다. (2 * 7^4) mod 6, (3 * 7^3) mod 6, (4 * 7^2) mod 6, (5 * 7^1) mod 6,

(6 * 7^0) mod 6도 동일한 과정으로 2 mod 6, 3 mod 6, 4 mod 6, 5 mod 6,

6 mod 6으로 바꿀 수 있으므로 결국 123456(7) mod 6은

 

1 mod 6 + 2 mod 6 + 3 mod 6 + 4 mod 6 + 5 mod 6 + 6 mod 6 = (1 + 2 + 3 + 4 + 5 + 6) mod 6

 

으로 바꿀 수 있다. 다른 진법의 수도 동한 과정으로 주어진 식을 모든 자릿수를 더한 뒤에 b-1 로 나눈 나머지를 구하는 식으로 치환할 수 있다. 따라서 주어진 수를 scanf를 통해 문자열로 받은 뒤, 각 문자를 모두 더해서 이를 b-1과 나머지 연산하면 답을 구할 수 있다.

 

 

전체 코드는 아래와 같다.

 

#include <cstdio>
#include <cstring>
int main() { //3944 나머지 계산
	int t;
	cin >> t;
	
	while (t--) {
		int i, b, sum=0;
		char d[10000000];
		scanf("%d", &b);
		scanf("%s", d);

		for (i = 0; i < strlen(d); i++) {
			sum += d[i] - 48;
		}
		printf("%d\n", sum % (b-1));
	}
}

 

'알고리즘 > 백준 알고리즘' 카테고리의 다른 글

[BOJ] 2759 팬케익 뒤집기  (0) 2020.12.20
[BOJ] 1637 날카로운 눈  (0) 2020.12.20
[BOJ] 2981 검문  (0) 2019.12.28
[BOJ] 2003 수들의 합 2  (0) 2019.11.23
[BOJ] 2164 카드 2  (0) 2019.11.22