728x90
λ°˜μ‘ν˜•


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

 

10986번: λ‚˜λ¨Έμ§€ ν•©

수 N개 A1, A2, ..., AN이 주어진닀. μ΄λ•Œ, μ—°μ†λœ λΆ€λΆ„ κ΅¬κ°„μ˜ 합이 M으둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” κ΅¬κ°„μ˜ κ°œμˆ˜λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. 즉, Ai + ... + Aj (i ≤ j) 의 합이 M으둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” (i, j)

www.acmicpc.net


책에 λ‚˜μ˜€λŠ” ꡬ간합 문제의 λνŒμ™•.. μ—­μ‹œλ‚˜ 문제 λΆ„μ„ν•˜κΈ° νŒŒνŠΈμ— λ‚˜μ˜€λŠ” μ‹λ“€μ΄λž‘ 말은 이해가 λ˜μ§€ μ•Šμ•˜κ³ ..
κ·Έλ ‡κ²Œ.. μ‚½μ§ˆμ΄ 2~3일간 계속 지속됐닀. μ±…μ—μ„œλŠ” 싀버 4의 λ‚œμ΄λ„λΌκ³  λ˜μ–΄μžˆμ§€λ§Œ, ν˜„μž¬λŠ” κ³¨λ“œ 3의 λ‚œμ΄λ„λ‹€.
μ†”μ§νžˆ ν•„μžλŠ” μ‹€λ²„λ¬Έμ œλ“€μ„ ν‘ΈλŠ”λ°λ„ λ„ˆλ¬΄ 였래 걸리고 μ΄ν•΄ν•˜λŠ” 데에도 λ„ˆλ¬΄ μ–΄λ €μ› λŠ”λ° κ³¨λ“œ λ‚œμ΄λ„λΌλ‹ˆ!
κ·Έλž˜λ„ 이왕 μ—¬κΈ°κΉŒμ§€ 온 κ±° 이 문제λ₯Ό λŒ€μΆ© λ„˜μ–΄κ°ˆ 수 μ—†μ—ˆκΈ°μ— 이것도 뢄석을 ν•΄λ³΄μ•˜λ‹€.
문제 이름이 λ‚˜λ¨Έμ§€ ν•© κ΅¬ν•˜κΈ°λΌκ³  ν•΄μ„œ μ§„μ§œ λ‚˜λ¨Έμ§€λ“€μ„ κ΅¬ν•œ 것듀을 λ”ν•˜λŠ” 것이 μ•„λ‹ˆλΌ,
μ—°μ†λ˜λŠ” 숫자λ₯Ό λ”ν•œ κ°’μ˜ λ‚˜λ¨Έμ§€κ°€ 0이 λ˜λŠ” μˆœμ„œμŒμ˜ 개수λ₯Ό ꡬ해야 ν•œλ‹€.
즉, 경우의 수의 κ°œλ… μ€‘μ˜ ν•˜λ‚˜μΈ 쑰합이 λ“€μ–΄κ°„λ‹€λŠ” 것이닀. 참고둜 ν•„μžλŠ” 경우의 μˆ˜λ‚˜ μ‘°ν•© 문제λ₯Ό μ–΄λ–»κ²Œ ν’€μ—ˆλƒλ©΄,
경우의 수 같은 κ²½μš°μ—λŠ” 일일이 λ…Έκ°€λ‹€ν•΄μ„œ ν’€μ—ˆμœΌλ©°, 쑰합은 곡식과 문제 ν˜•μ‹μ„ λ‹¨μˆœμ•”κΈ°ν•΄μ„œ ν’€μ—ˆλ‹€.
덕뢄에 μ‹œν—˜μ§€μ™€ κ΅κ³Όμ„œλŠ” λ…Έκ°€λ‹€μ˜ ν”μ μœΌλ‘œ κ·Έ 파트만 빽빽해지고 λ„ˆλœλ„ˆλœν•΄μ‘Œλ˜ 기얡이 λ‚œλ‹€.
ν•˜μ§€λ§Œ κ±±μ •ν•  ν•„μš” μ—†λ‹€! μ§€κΈˆμ΄λΌλ„ 쑰합에 λŒ€ν•΄μ„œ μ œλŒ€λ‘œ μ•Œκ³  ν’€λ©΄ λœλ‹€.
사싀 ν•„μžλ„ 이 문제 λ•Œλ¬Έμ— 쑰합을 λ‹€μ‹œ κ³΅λΆ€ν–ˆλ‹€.
μ‘°ν•©μ΄λž€, μ„œλ‘œ λ‹€λ₯Έ n개의 μ›μ†Œλ₯Ό κ°€μ§€λŠ” μ–΄λ–€ μ§‘ν•©μ—μ„œ μˆœμ„œ 상관없이 r개의 μ›μ†Œλ₯Ό κ³ λ₯΄λŠ” 것이닀.
μœ„ν‚€λ°±κ³Όμ—μ„  μ΄λ ‡κ²Œ μ„€λͺ…ν•˜κ³  μžˆμ–΄μ„œ λ³΅μž‘ν•΄λ³΄μΌ μˆ˜λ„ μžˆμ§€λ§Œ, 예λ₯Ό λ“€μ–΄λ³΄μž.
μ£Όλ¨Έλ‹ˆμ— 10개의 ꡬ슬이 μžˆλ‹€. κ΅¬μŠ¬λ“€μ—λŠ” λ²ˆν˜Έλ„ μ—†κ³ . 색깔도 λͺ¨λ‘ κ°™λ‹€. κ·Έ 쀑에 2개λ₯Ό λ½‘λŠ”λ‹€κ³  κ°€μ •ν•˜μž.
그럼 κ·Έ κ΅¬μŠ¬μ„ κΊΌλ‚΄λŠ”λ°μ— μˆœμ„œκ°€ ν•„μš”ν•œκ°€? 결과적으둜 μš°λ¦¬λŠ” κ·Έ 쀑에 2개의 κ΅¬μŠ¬μ„ λ½‘μ€κ²Œ λ˜λŠ” 것이닀.
μ΄λ ‡κ²Œ λ½‘λŠ” μˆœμ„œκ°€ μ€‘μš”ν•˜μ§€ μ•Šκ³ , 결과적으둜 λ¨Όμ € 뽑은 것을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€λ₯Ό λ½‘κ²Œ λœλ‹€λ©΄ 쑰합을 μ‚¬μš©ν•˜κ³ ,
μˆœμ—΄μ€ λ½‘λŠ” μˆœμ„œκ°€ μ •ν•΄μ ΈμžˆμœΌλ©°, 뽑은 것을 λ‚˜μ—΄ν•΄μ•Ό ν•œλ‹€λ©΄ μ‚¬μš©ν•˜λŠ” 것이닀.
μˆœμ—΄μ˜ κΈ°ν˜ΈλŠ” \(_{n}P_{r}\)이고, μ‘°ν•©μ˜ κΈ°ν˜ΈλŠ” \(_{n}C_{r}\)이닀. μ΄λ•Œ, \(_{n}C_{r}\)은
$$\frac{n(n-1)(n-2)...\{n-(r-1)\}}{r!}$$

μ΄λ•Œ, λΆ„μžμ— μœ„μΉ˜ν•œ n은 r개 만큼 κ³±ν•˜λŠ” 것이닀. 예λ₯Όλ“€μ–΄ 10개 쀑에 2개λ₯Ό λ½‘λŠ”λ‹€κ³  ν–ˆμ„ λ•Œ, μ²˜μŒμ—” 10κ°œμ€‘μ— ν•˜λ‚˜λ‹ˆκΉŒ 10κ°€μ§€μ˜ 경우의 μˆ˜κ°€ μžˆμ§€λ§Œ, ν•˜λ‚˜λ₯Ό 뽑고 λ‚˜μ„œλŠ” 9개의 경우의 μˆ˜κ°€ 있기 λ•Œλ¬Έμ— 10*9λ₯Ό ν•΄μ€€λ‹€. μ—¬κΈ°μ„œ 2개만 ν•˜λŠ” μ΄μœ λŠ” μš°λ¦¬λŠ” κ΅¬μŠ¬μ„ 2개만 λ½‘λŠ” 것이기 λ•Œλ¬Έμ΄λ‹€. 3개λ₯Ό λ½‘λŠ”λ‹€λ©΄ 8κ°€μ§€μ˜ κ°€λŠ₯성이 또 생기기 λ•Œλ¬Έμ— 10*9*8을 ν•΄μ€˜μ•Ό ν•œλ‹€. r!을 λ‚˜λˆ„λŠ” μ΄μœ λŠ” 뽑은 μˆœμ„œλŠ” λ‹€λ₯΄μ§€λ§Œ 같은 κ΅¬μŠ¬μ„ λ½‘μ•˜μ„ 경우λ₯Ό μ—†μ• μ£ΌκΈ° μœ„ν•΄μ„œμ΄λ‹€.
이제 문제λ₯Ό ν’€κΈ° μœ„ν•œ μˆ˜ν•™μ  κ°œλ…μ€ λ‹€λ€˜μœΌλ‹ˆ, 이제 λ‹€μ‹œ 문제둜 λ„˜μ–΄μ™€λ³΄μž.
사싀 ν•„μžλŠ” 문제 λΆ„μ„ν•˜κΈ° 파트의 λ‚˜λ¨Έμ§€ ν•© 문제 ν’€μ΄μ˜ 핡심 아이디어 뢀뢄을 또 μ΄ν•΄ν•˜μ§€ λͺ»ν–ˆκΈ° λ•Œλ¬Έμ—,
'이게 무슨 말이지' ν•˜λ©΄μ„œ λΆ„μ„ν–ˆμ—ˆλ‹€.
μ•„λž˜λŠ” 책에 μ ν˜€μžˆλŠ” 핡심 아이디어 뢀뢄을 λ‚΄ μŠ€νƒ€μΌλŒ€λ‘œ 고쳐써본 것이닀.

  1. (A+B)%C = ((A%C) + (B%C))%C, 고둜 (A+B)%C둜만 계산해도 λœλ‹€.
  2. ν•© λ°°μ—΄ S[(ν˜„μž¬ν•­)] - S[(μ „ ν•­)]은 원본 λ°°μ—΄μ˜ (μ „ ν•­)+1 ~ (ν˜„μž¬ν•­)κΉŒμ§€μ˜ ꡬ간 합이닀.
  3. ꡬ간 ν•© λ°°μ—΄μ˜ μ›μ†Œλ₯Ό M으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ‘œ μ—…λ°μ΄νŠΈν•˜κ³  S[(ν˜„μž¬ν•­)]κ³Ό S[(μ „ ν•­)]이 κ°™λ‹€λ©΄ 원본 λ°°μ—΄μ—μ„œ
    (μ „ ν•­)+1 ~ (ν˜„μž¬ν•­)κΉŒμ§€μ˜ ꡬ간 합이 M으둜 λ‚˜λˆ„μ–΄λ–¨μ–΄μ§„λ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.
    (S[(ν˜„μž¬ν•­)]%M = S[(μ „ ν•­)]%M 이면 (S[(ν˜„μž¬ν•­)] - S[(μ „ ν•­)])%M = 0)

자, 이제 λ¬Έμ œμ— λŒ€ν•œ 뢄석은 끝났닀. μ½”λ“œλ‘œ λ„˜μ–΄μ™€λ³΄μž.
ν•© λ°°μ—΄ S에 λˆ„μ ν•©μ˜ 값을 μ €μž₯ν•΄μ€€λ‹€. λˆ„μ ν•©μ˜ μžμ„Έν•œ μ„€λͺ…은 https://life-study-1031.tistory.com/7

 

[ꡬ간합, JAVA]λ°±μ€€ - 11659번

문제: https://www.acmicpc.net/problem/11659 11659번: ꡬ간 ν•© κ΅¬ν•˜κΈ° 4 첫째 쀄에 수의 개수 Nκ³Ό 합을 ꡬ해야 ν•˜λŠ” 횟수 M이 주어진닀. λ‘˜μ§Έ μ€„μ—λŠ” N개의 μˆ˜κ°€ 주어진닀. μˆ˜λŠ” 1,000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄

life-study-1031.tistory.com

이 글에 μžμ„Ένžˆ μžˆμœΌλ‹ˆ λˆ„μ ν•©μ— λŒ€ν•΄μ„œ 잘 λͺ¨λ₯΄κ² λ‹€λ©΄ 이 글을 μ°Έκ³ ν•΄μ£Όλ©΄ λœλ‹€.
λˆ„μ ν•©μ˜ 값을 μ €μž₯ν•˜λŠ” μ΄μœ λŠ” 합이 M으둜 λ‚˜λˆ„μ–΄λ–¨μ–΄μ§€λŠ” μˆœμ„œμŒμ„ ꡬ해야 ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. λˆ„μ ν•©μ„ κ΅¬ν•œ λ‹€μŒ, M으둜 λ‚˜λˆ μ„œ λ‚˜λˆ„μ–΄λ–¨μ–΄μ§„λ‹€λ©΄ 1ν•­λΆ€ν„° κ·Έ ν•­(n항이라고 κ°€μ •ν•˜μž)κΉŒμ§€ λ”ν•œ 값이 λ‚˜λˆ„μ–΄λ–¨μ–΄μ§€λŠ” 것이기 λ•Œλ¬Έμ— (1,n)이 μ„±λ¦½λ˜λ―€λ‘œ, 닡이 될 수 μžˆλŠ” 것이닀.
κ·Έ λ‹€μŒμœΌλ‘œλŠ” μ‘°ν•©μ˜ κ°œλ…μ„ μ΄μš©ν•˜μ—¬ 닡을 ꡬ해야 λ˜λŠ”λ°, 그러기 μœ„ν•΄μ„  λ¨Όμ € λ‚˜λ¨Έμ§€μ˜ 개수λ₯Ό μ…€ 수 μžˆμ–΄μ•Ό ν•œλ‹€. 예λ₯Ό λ“€μ–΄λ³΄μž. λ‚˜λ¨Έμ§€κ°€ [1, 0, 0, 1, 0]일 경우, 0이 3κ°œκ°€ μžˆλ‹€. μ΄λ•Œ 0이 λ‚˜μ˜€λŠ” μˆœμ„œμŒμ€ 각각 λ‹€λ₯Ό 것이닀. κ·Έλ ‡κ²Œ 0이 λ‚˜μ˜€λŠ” 3가지 경우 μ€‘μ—μ„œ i와 j에 ν•΄λ‹Ήν•˜λŠ” μˆœμ„œμŒμ„ μˆœμ„œμ™€ 상관없이 λ½‘λŠ” 것이기 λ•Œλ¬Έμ— \(_{3}C_{2}\)λ₯Ό ν•΄μ•Ό ν•˜κ³ , 그것을 μœ„ν•΄μ„œλŠ” λ‚˜λ¨Έμ§€μ˜ κ°œμˆ˜κ°€ ν•„μš”ν•˜λ‹€. λ¬Όλ‘  0ν•˜λ‚˜μ— i,j μˆœμ„œμŒμ΄ μžˆκΈ°μ— \(_{6}C_{2}\)κ°€ μ•„λ‹Œκ°€μš”? 생각할 μˆ˜λ„ μžˆκ² μ§€λ§Œ, μ΄λ ‡κ²Œ 되면 λ‚˜λ¨Έμ§€κ°€ 0κ³Ό λ‹¬λΌμ§€λŠ” μˆœμ„œμŒμ΄ λ‚˜μ˜¬ μˆ˜λ„ 있기 λ•Œλ¬Έμ— \(_{3}C_{2}\)λ₯Ό ν•΄μ•Ό ν•œλ‹€.
μ—¬κΈ°μ„œ 질문이 λ‚˜μ˜¬ 수 μžˆλ‹€. λ‚˜λ¨Έμ§€κ°€ 0인 κ²ƒλ“€μ˜ 경우만 μ„Έλ©΄ λ˜λŠ”λ°, μ™œ ꡳ이 0보닀 큰 λ‚˜λ¨Έμ§€λ“€μ˜ κ°œμˆ˜λ„ μ„ΈλŠ” 것인가? μ΄λŠ” 문제λ₯Ό 뢄석할 λ•Œ 3λ²ˆμ— ν•΄λ‹Ήν•˜λŠ” κ°œλ…μ„ μ΄μš©ν•œκ±΄λ°, S[(ν˜„μž¬ν•­)]κ³Ό S[(μ „ ν•­)]의 값이 κ°™μœΌλ©΄ (μ „ ν•­)+1 ~ (ν˜„μž¬ν•­)κΉŒμ§€μ˜ ꡬ간 합이 M으둜 λ‚˜λˆ„μ–΄λ–¨μ–΄μ§€λŠ” ꡬ간이기 λ•Œλ¬Έμ— 0보닀 큰 λ‚˜λ¨Έμ§€μ˜ κ°œμˆ˜λ„ μ„Έμ–΄μ£ΌλŠ” 것이닀.
κ΅¬κΈ€λ§μœΌλ‘œ 찾은 풀이와 μ±…μ—μ„œ λ‚˜μ˜¨ ν’€μ΄λ“€μ˜ 곡톡점을 찾자면 S[i]%M의 κ°’κ³Ό λ‚˜λ¨Έμ§€λ₯Ό μ €μž₯ν•˜λŠ” λ°°μ—΄μ˜ μΈλ±μŠ€κ°€ κ°™λ‹€λŠ” 것인데, μ΄λ ‡κ²Œ μ„€μ •ν•œ μ΄μœ λŠ” κ·Έ λ‚˜λ¨Έμ§€μ˜ 개수λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄μ„œμ΄λ‹€. 예λ₯Ό λ“€μ–΄, λ‚˜λ¨Έμ§€κ°€ [1, 0, 0, 1, 0] μ΄λ ‡κ²Œ λ‚˜μ™”λ‹€λ©΄ μ‚¬λžŒμ€ 0이 3개, 1이 2개 μ΄λ ‡κ²Œ μ…€ 수 μžˆμ§€λ§Œ μ»΄ν“¨ν„°λŠ” 일일이 1μ”© λ”ν•΄μ€˜μ•Ό ν•˜κΈ° λ•Œλ¬Έμ—, λ‚˜λ¨Έμ§€λ₯Ό μ €μž₯ν•˜λŠ” λ°°μ—΄μ˜ μΈλ±μŠ€μ™€ κ°™κ²Œ ν•œ 것이닀. 그림을 보면 이해가 μ‰¬μšΈ 것이닀.

λ‚˜λ¨Έμ§€κ°€ 10010일 경우의 λ‚˜λ¨Έμ§€ 개수 μ„ΈλŠ” λ°°μ—΄μ˜ κ°’

이런 μ‹μœΌλ‘œ μ €μž₯이 λ˜λŠ” 것이닀. 우린 이제 \(_{3}C_{2}+_{2}C_{2}\)의 값을 κ΅¬ν•˜λ©΄ λœλ‹€.

이제 풀이에 κ΄€λ ¨λœ μ½”λ“œνŒŒνŠΈλ„ 끝이 났닀.

μ΄λ²ˆμ—λŠ” μˆ˜ν•™μ˜ κ°œλ…κ³Ό 코딩이 같이 λ‚˜μ™€μ„œ ν•„μžλ„ 이 글을 μ“°λŠ”λ°μ— 3~4일 정도 κ±Έλ¦° 것 κ°™λ‹€.
λ‚΄μš©μ΄ 정리가 잘 λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ΄λ‹€. μ΄μ œλŠ” μž‘μ„±ν•˜λ©΄μ„œ 많이 정리가 λΌμ„œ 머릿속이 ν•œκ²° 깔끔해진 것 κ°™λ‹€.
이번 λ‚΄μš©μ„ μš”μ•½ν•˜μžλ©΄
β‘  이 문제λ₯Ό ν’€κΈ° μœ„ν•΄μ„  μˆ˜ν•™μ  κ°œλ… 쀑 쑰합을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
    μ‘°ν•©μ˜ μˆ˜μ‹μ€ \(\frac{n(n-1)(n-2)...\{n-(r-1)\}}{r!}\)

β‘‘ λ‚˜λ¨Έμ§€λ₯Ό μ €μž₯ν•˜λŠ” λ°°μ—΄μ˜ 인덱슀 = λ‚˜λ¨Έμ§€ μ΄λ ‡κ²Œ 연산을 ν•΄μ„œ λ‚˜λ¨Έμ§€μ˜ 개수λ₯Ό μ„Έμ–΄μ€€λ‹€.
    κ·Έ μ΄μœ λŠ” μˆœμ„œμŒμ˜ 경우의 수λ₯Ό 더해주기 μœ„ν•΄μ„œ.
첫번째둜 ν•©λ°°μ—΄ S에 λ‚˜λ¨Έμ§€λ₯Ό κ·ΈλŒ€λ‘œ λ„£μ–΄μ„œ κ³„μ‚°ν•˜λŠ” μ½”λ“œλ‹€.

import java.io.*;
import java.util.*;

public class Main {

	public static void main(String[] args) throws IOException{
		// TODO λ°±μ€€ 10986번
		
        //μž…λ ₯을 빨리 λ°›κΈ° μœ„ν•΄ BufferedReader 클래슀λ₯Ό μ΄μš©ν•΄μ„œ μž…λ ₯을 λ°›μŒ
        //BufferedReader 클래슀둜 μž…λ ₯을 λ°›μœΌλ©΄ λ¬Έμžμ—΄ νŒŒμ‹±μ΄ ν•„μš”ν•¨.
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
        //N = 숫자λ₯Ό μž…λ ₯받을 개수, M = μž…λ ₯받을 μˆ«μžλ“€μ„ λ‚˜λˆŒ 숫자
        //sums = ν•©λ°°μ—΄ S, count = λ‚˜λ¨Έμ§€ λ°°μ—΄, answer = μˆœμ„œμŒ 개수
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		long[] sums = new long[N+1];
		long[] count = new long[1000];
		long answer = 0;
		
        //λˆ„μ ν•© λ°°μ—΄ λ§Œλ“€κΈ°
		st = new StringTokenizer(br.readLine());
		for(int i=1; i<=N; i++) {
			sums[i] = sums[i-1] + Integer.parseInt(st.nextToken());
		}
		
		for(int i=1; i<=N; i++) {
			//sums[i]에 %M 연산을 ν•˜κ³  sums[i]에 λ‹€μ‹œ μ €μž₯
            sums[i] %= M;
			
            //λ‚˜λ¨Έμ§€κ°€ 0이면 answerλ₯Ό λ”ν•΄μ€Œ = μˆœμ„œμŒμ˜ 개수λ₯Ό μ„Έμ–΄μ€Œ
			if(sums[i] == 0) {
				++answer;
			}
			
            //λ‚˜λ¨Έμ§€μ— ν•΄λ‹Ήν•˜λŠ” μΈλ±μŠ€μ— 1을 λ”ν•΄μ€Œ
			++count[(int)sums[i]];
		}
		
        //쑰합을 μ΄μš©ν•œ μˆ˜μ‹
        //2λ₯Ό λ‚˜λˆˆ μ΄μœ λŠ” 2! = 1*2 = 2 이기 λ•Œλ¬Έμ΄λ‹€.
		for(int i=0; i<count.length; i++) {
			if(count[i] > 1) {
				answer += count[i]*(count[i]-1)/2;
			}
		}
		
        //μ •λ‹΅ 좜λ ₯
		System.out.println(answer);
	}

}

 

λ‘λ²ˆμ§Έλ‘œλŠ” μƒˆλ‘œμš΄ λ³€μˆ˜λ₯Ό μ΄μš©ν•œ 방법이닀.

import java.io.*;
import java.util.*;

public class BOJ_10986 {

	public static void main(String[] args) throws IOException{
		// TODO λ°±μ€€ 10986
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int N = Integer.parseInt(st.nextToken()); //μž…λ ₯받을 숫자의 개수
		int M = Integer.parseInt(st.nextToken()); //λ‚˜λˆŒ 수
		long[] sums = new long[N+1];
		long[] count = new long[1000];
		long answer = 0;
		
        //μ΄λ ‡κ²Œ ν•˜λ©΄ for문을 1개만 써도 ν•©λ°°μ—΄ S의 값을 μ†μƒμ‹œν‚€μ§€ μ•Šκ³  κ³„μ‚°ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.
		st = new StringTokenizer(br.readLine());
		for(int i=1; i<=N; i++) {
			sums[i] = sums[i-1] + Integer.parseInt(st.nextToken());
            //λ‚˜λ¨Έμ§€λ₯Ό μ €μž₯ν•˜λŠ” λ³€μˆ˜λ₯Ό 선언함.
			int rem = (int) (sums[i]%M);
			
            //λ‚˜λ¨Έμ§€κ°€ 0이면 answerλ₯Ό λŠ˜λ €μ€€λ‹€.
			if(rem == 0) {
				++answer;
			}
			
            //λ‚˜λ¨Έμ§€λ₯Ό λ‚˜λ¨Έμ§€ λ°°μ—΄μ˜ 인덱슀둜 μ΄μš©ν•˜μ—¬ λ‚˜λ¨Έμ§€μ˜ 개수λ₯Ό μ„Έμ–΄μ€€λ‹€.
			++count[rem];
		}
		
		for(int i=0; i<count.length; i++) {
			if(count[i] > 1) {
				answer += count[i]*(count[i]-1)/2;
			}
		}
		
		System.out.println(answer);
	}
}
728x90
λ°˜μ‘ν˜•

+ Recent posts