본문 바로가기

algorithm

백준 10986번 나머지 합

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

 

아이디어:

1. 1차원 long vector 생성.

2. 합 vector S 생성, S 각 요소에 대해 M으로 나눈 나머지로 변경

ex) 백준 예제 입력: 1 2 3 1 2 > 1 3 6 7 9 > 1 0 0 1 0

3. 먼저 나온 0은 하나씩 더해주기 = 3

4. 같은 나머지가 나온 요소에 대해서 조합 x C 2를 적용

ex) 나머지 0인 요소가 3개이므로 3 C 2, 나머지 1인 요소가 2개이므로 2 C 2

조합 = x * (x - 1) / 2

같은 나머지가 나온 요소 쌍이 M으로 나누어 떨어지는 구간인 이유:

구간 합 (i, j) = S[j] - S[i - 1]

   %  

 %    %  

 %   % 

 

// 10986

#include <iostream>
#include <vector>

using namespace std;

int main() {

	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	long N, M, temp, answer = 0;
	
	cin >> N >> M;

	vector<long> S(N + 1, 0);
	vector<long> C(M, 0);

	for (long i = 1; i <= N; i++) {
		cin >> temp;
		S[i] = S[i - 1] + temp;
	}

	for (long i = 1; i <= N; i++) {
		S[i] %= M;
		C[S[i]]++;
	}

	answer += C[0];

	for (long i = 0; i < M; i++) {
		if (C[i] > 1) {
			answer += (C[i] * (C[i] - 1)) / 2;
		}
	}

	cout << answer;

	return 0;

}

'algorithm' 카테고리의 다른 글

백준 1940번 주몽  (0) 2024.12.01
백준 2018번 수들의 합 5  (0) 2024.11.24
백준 11660번 구간 합 구하기 5  (0) 2024.11.24
백준 11659번 구간 합 구하기  (0) 2024.11.17
백준 1546번 평균  (0) 2024.11.17