다이나믹프로그래밍(DP)
백준 10986번: 나머지 합
cepiloth
2018. 7. 1. 19:20
반응형
https://www.acmicpc.net/problem/10986
1. 문제
수 N개 A1, A2, ..., AN이 주어진다. 이 때, 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 구하는 프로그램을 작성하시오. 즉, Ai + ... + Aj (i ≤ j) 의 합이 M으로 나누어 떨어지는 (i, j) 쌍의 개수를 구해야 한다.
2. 알고리즘
키워드 - DP, 부분합
참고 - https://www.slideshare.net/Baekjoon/baekjoon-online-judge-10986
3. 코드
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 | #include <iostream> #include <sstream> #include <string> #include <algorithm> #include <functional> #include <vector> #include <list> #include <queue> #include <deque> #include <map> #include <set> #include <stack> using namespace std; #define MAX_SIZE 100 #define INF 0x7fffffff #define CENDL "\n" #define ll long long /* * @memory - 1992 kb * @time - 144 ms */ ll ans[1001]; int main() { cin.tie(0); std::ios::sync_with_stdio(false); int n, m; cin >> n >> m; ll sum = 0; for(int i=0; i<n; i++) { int cand; cin >> cand; sum += cand; ans[sum % m]++; } ll sol = ans[0]; for(int i=0; i<m; i++) { sol += (ans[i] * (ans[i]-1)) /2; } cout << sol << CENDL; return 0; } | cs |
반응형