반응형
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 44 45 46 47 48 49 50 51 52 53 54 | #include <iostream> #include <cstring> using namespace std; //a[i]+....+a[j] = sum[j] - sum[i-1] //(a[i]+....+a[j])%M = (sum[j] - sum[i-1])%M //s[i]%m = s[j]%m인 부분을 찾으면 된다. //cnt[k] => (s[i]%m == k) 인 i의 개수 //cnt[i] * (cnt[i]-1) / 2의 합이 쌍의 개수이다 int main() { long long n; long long m; long long ans = 0; cin >> n >> m; long long *a = new long long [n + 1]; long long sum = 0; long long *cnt = new long long[m]; memset(a, 0, sizeof(long long)); for (long long i = 0; i < m; i++) cnt[i] = 0; cnt[0] = 1; for (long long i = 1; i <= n; i++) { cin >> a[i]; a[i] %= m; sum += a[i]; sum %= m; cnt[sum]++; } /*for (int i = 1; i <= n; i++) { for (int j = i; j <= n; j++) { if ((sum[j] - sum[i - 1]) % m == 0) ans++; } }*/ //n^2시간이기에 무조건 시간 초과다 for (long long i = 0; i < m; i++) { ans += cnt[i] * (cnt[i] - 1) / 2; } cout << ans << '\n'; } | cs |
'Algorithm' 카테고리의 다른 글
(C++) - 백준(BOJ) 9613번 : GCD합 (2) | 2019.05.02 |
---|---|
(C++) - 백준(BOJ) 2231번 : 분해합 (2) | 2019.03.21 |
(C++) - 백준(BOJ) 2553번 : 마지막 팩토리얼 수 답 (0) | 2019.02.18 |
(C++) - 백준(BOJ) 15953번 : 상금헌터 답 (0) | 2019.02.12 |
(C++) - 백준(BOJ) 10989번 : 수 정렬하기 3 답 (0) | 2019.02.12 |