공부기록/백준

[백준] 10986번 나머지 합

메델 2023. 12. 11. 14:15
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        int m = kb.nextInt();
        long[] sum = new long[m]; // 나머지 별 개수를 저장할 배열
        long answer = 0;
        long prefixSum = 0;

        sum[0] = 1; // 초기값 설정

        for (int i = 0; i < n; i++) {
            prefixSum = (prefixSum + kb.nextLong()) % m;
            answer += sum[(int) prefixSum]; // 이전까지의 누적합을 더함
            sum[(int) prefixSum]++; // 현재 누적합의 개수를 증가시킴
        }

        System.out.println(answer);
    }
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
    	Scanner kb = new Scanner(System.in);
    	int N = kb.nextInt();
    	int M = kb.nextInt();
    	
    	int sum = 0;
    	int[] count = new int[M];

    	for(int i=0; i<N; i++) {
    		sum = (sum+ kb.nextInt())%M;
    		count[sum]++;
    	}
    	
    	long answer = count[0];
    	
    	for(int i=0; i<M; i++) {
    		answer += (long) count[i] * (count[i]-1)/2;
    	}
    	System.out.println(answer);
    }
}

 

구간 합의 경우 sum[j] - sum[i] 로 구할 수 있는데 이 문제에서 M으로 나눈 나머지가 0인 쌍을 구해야한다.

(sum[j] - sum[i])%M = 0을 정리하면 sum[j]%M = sum[i]%M이다. 

따라서, sum[j]%M = sum[i]%M을 구하면 된다.

 

(1) sum[j]%M = sum[i]%M 

(2) sum[i] % M = 0 인 경우 (배열의 0부터 i까지의 구간의 합이 이미 M으로 나누어떨어진다)

 

 

 

 

'공부기록 > 백준' 카테고리의 다른 글

[백준] 1253번 좋다  (0) 2023.12.13
[백준] 1940번 주몽  (0) 2023.12.11
[백준] 11866번 요세푸스 문제 0  (0) 2023.12.05
[백준] 1715번 카드 정렬하기  (0) 2023.11.22
[백준] 10810번 공 넣기  (0) 2023.11.21