백준 10986 번 : 나머지 합 / C++

2023. 2. 23. 13:55개인공부/코딩테스트

10986번: 나머지 합 (acmicpc.net)

 

10986번: 나머지 합

수 N개 A1, A2, ..., AN이 주어진다. 이때, 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 구하는 프로그램을 작성하시오. 즉, Ai + ... + Aj (i ≤ j) 의 합이 M으로 나누어 떨어지는 (i, j)

www.acmicpc.net

구간합 아이디어의 응용문제이고 처음 풀이에서 자료형을 int 를 사용했는데 범위를 초과해서 long long 으로 수정하니 해결 되었다.

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
32
33
34
35
36
37
38
39
40
41
42
43
 
#include<iostream>
 
using namespace std;
 
 
int main()
{
    cin.tie(NULL);
    cout.tie(NULL);
    ios::sync_with_stdio(false);
 
    int N, M;
    cin >> N >> M;
 
    long long* Remain = new long long[M];
 
    for (int i = 0; i < M; ++i)
    {
        Remain[i] = 0;
    }
    Remain[0= 1;
    int PrevRemain = 0;
    long long ans = 0;
    for (int i = 0; i < N; ++i)
    {
        int num = 0;
        cin >> num;
        num = num % M;
        PrevRemain = (num + PrevRemain) % M;
        ++Remain[PrevRemain];
    }
 
    for (int i = 0; i < M; ++i)
    {
        if (Remain[i] > 1)
            ans += Remain[i] * (Remain[i] - 1/ 2;
    }
 
    cout << ans;
    return 0;
}
 
cs