๐ฉ๐ป๐พ
[๋ฐฑ์ค/Python] 10986๋ฒ ๋๋จธ์ง ๋ณธ๋ฌธ
1๏ธโฃ๋ฌธ์ ์ค๋ช
์ N๊ฐ A1, A2, ..., AN์ด ์ฃผ์ด์ง๋ค. ์ด๋, ์ฐ์๋ ๋ถ๋ถ ๊ตฌ๊ฐ์ ํฉ์ด M์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ ๊ตฌ๊ฐ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ฆ, Ai + ... + Aj (i ≤ j) ์ ํฉ์ด M์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ (i, j) ์์ ๊ฐ์๋ฅผ ๊ตฌํด์ผ ํ๋ค.
2๏ธโฃ์ ๋ ฅ
์ฒซ์งธ ์ค์ N๊ณผ M์ด ์ฃผ์ด์ง๋ค. (1 ≤ N ≤ 106, 2 ≤ M ≤ 103)
๋์งธ ์ค์ N๊ฐ์ ์ A1, A2, ..., AN์ด ์ฃผ์ด์ง๋ค. (0 ≤ Ai ≤ 109)
3๏ธโฃ์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ฐ์๋ ๋ถ๋ถ ๊ตฌ๊ฐ์ ํฉ์ด M์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ ๊ตฌ๊ฐ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
๐ฉ๐ป๐ป์์ฑํ ์ฝ๋
import sys
input = sys.stdin.readline
n, m = map(int, input().split()) # ์ซ์ ๊ฐ์, ๋๋๋ ์
num = list(map(int, input().split())) # ์ซ์ ๋ฐ์ดํฐ
S = [0] * n # ๋์ ํฉ
C = [0] * m # ๊ฐ์ ๋๋จธ์ง์ ์ธ๋ฑ์ค info
cnt = 0 # m์ผ๋ก ๋๋์ด๋จ์ด์ง๋ ๊ตฌ๊ฐ์ ๊ฐ์
for i in range(n):
S[i] = S[i-1] + num[i]
remainder = S[i] % m
if remainder == 0:
cnt += 1
C[remainder] += 1
for i in range(m):
if C[i] > 1:
cnt += (C[i] * (C[i]-1) // 2)
print(cnt)
๐ก์ฝ๋ ์ค๋ช
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์์์ผํ ๊ฐ๋ ์ ' S[ i ] % m์ ๊ฐ๊ณผ S[ j ] % m์ ๊ฐ์ด ๊ฐ๋ค๋ฉด ( S[ i ] - S[ j ] ) % m = 0 ' ์ด๋ค. ๊ทธ๋์ ๋๋จธ์ง ๊ฐ์ด ๊ฐ์ ๋์ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ธฐ ์ํด list C๋ฅผ ์ฌ์ฉํ์๊ณ , C[index]๋ ๊ฐ์ ๋๋จธ์ง๋ฅผ ๊ฐ๋ ์์์ ๊ฐ์๋ฅผ ๊ฐ๋ฅดํจ๋ค.
์๋ฅผ ๋ค์ด m์ด 3์ผ ๊ฒฝ์ฐ, C[2]๋ ๋๋จธ์ง๊ฐ 2์ผ ๋์ ๊ฐ์ ๋ํ๋ธ๋ค.
์ฒซ๋ฒ์งธ for๋ฌธ์ ๋ณด๋ฉด, reminder๋ ๋์ ํฉ์ m์ผ๋ก ๋๋์์ ๋์ ๋๋จธ์ง ๊ฐ์ด๊ณ ์ด๋, remainder๊ฐ 0 ์ผ ๋ cnt์ ๊ฐ์ +1 ํด์ค๋ค. remainder๊ฐ 0์ด ์๋ ๊ฒฝ์ฐ, C[remainder]์ ๊ฐ์ +1 ํด์ค๋ค.
๋๋ฒ์งธ for๋ฌธ์ ๋ณด๋ฉด, C[remainder]์ ๊ฐ์ด 2 ์ด์์ด๋ฉด ' ( S[ i ] - S[ j ] ) % m = 0 '์ ๊ฐ๋ ์ ์ ์ฉํ๊ธฐ ์ํด ์์ ๊ฐ์ด ๊ฐ์ 2๊ฐ์ ์์๋ฅผ ๋ฝ๋ ๊ฒฝ์ฐ๋ฅผ ์กฐํฉ ๊ณต์์ ์ฌ์ฉํด์ ๊ตฌํ๋ค. cnt์ ๊ตฌํ ๊ฐ์ ๋ํด์ค๋ค.
'์ฝ๋ฉํ ์คํธ > ๋ฐฑ์ค(BOJ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/Python] 1253๋ฒ ์ข์ ์ ๊ตฌํ๊ธฐ (0) | 2023.01.31 |
---|---|
[๋ฐฑ์ค/Python] 2018๋ฒ ์ฐ์๋ ์์ฐ์์ ํฉ ๊ตฌํ๊ธฐ (0) | 2023.01.29 |
[๋ฐฑ์ค/Python] 1940๋ฒ ์ฃผ๋ชฝ (0) | 2023.01.29 |
[๋ฐฑ์ค/Python] 11660๋ฒ ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ 2 (0) | 2023.01.28 |
[๋ฐฑ์ค/Python] 11659๋ฒ ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ (0) | 2023.01.24 |