π λ¬Έμ μ€λͺ
Nκ°μ μ«μκ° μ£Όμ΄μ§ λ, μ°μλ λΆλΆ κ΅¬κ° ν©μ΄ MμΌλ‘ λλμ΄ λ¨μ΄μ§λ ꡬκ°μ κ°μ
λ°°μ΄ [1, 2, 3, 1, 2]μμ 3μΌλ‘ λλμ΄ λ¨μ΄μ§λ ꡬκ°?
π [1, 2], [1, 2, 3], [3], [2, 3, 1], [3, 1, 2], [1, 2] = `7κ°`
- N: μ«μ κ°μ (N ≤ λ°±λ§)
- M: λλλ μ (M <= 1,000)
- Aβ <= 1μ‘°
μ«μκ° λ°±λ§ κ°κΉμ§ μ£Όμ΄μ§ μ μμ΄μ `O(NLogN) μ΄ν`μ μκ° λ³΅μ‘λλ‘ νμ΄μΌ μκ° μ΄κ³Όκ° λμ§ μλλ€.
λΆλΆ ꡬκ°μ κ°μλ₯Ό ꡬν΄μΌ νλ―λ‘ κ³μ° ν λλ§λ€ ν©μ κ΅¬ν΄ λκ°λ κ² μλ, `λμ ν©`μ μ΄μ©ν΄ νμ΄μΌ νλ€.
MμΌλ‘ λλμ΄ λ¨μ΄μ§λ, μ¦ MμΌλ‘ λλ λλ¨Έμ§κ° 0μΈ κ΅¬κ°μ ꡬνλ €λ©΄ `(A+B) % M == 0` μμμΌλ‘ νλ©΄ λλ€.
π λλ¨Έμ§ μ°μ°
(A+B)%C λ {(A%C) + (B%C)} % Cμ λμΌνλ€.
μ°λ¦¬λ λλ¨Έμ§ μ°μ°μ κ²°κ³Ό κ°μ΄ 0μΈ κ΅¬κ°μ ꡬν΄μΌ νλ―λ‘ `{(A%C) + (B%C)} % C = 0` μμμ μ΄μ©νλ©΄ λλ€.
μκ° νκΈ°
[1, 2, 3, 1, 2] λ°°μ΄μ΄ μ£Όμ΄μ‘μ λ, λμ ν©μ ꡬνλ©΄ [1, 3, 6, 7, 9]κ° λλ€.
- κ° μμλ 0λΆν° ~ νμ¬ μΈλ±μ€κΉμ§μ ν©μ λνλΈλ€.
- νΉμ μΈλ±μ€(j) ~ νμ¬ μΈλ±μ€(i)μ λΆλΆν©μ `S[i] - S[j-1]`μ΄ λλ€.
μ¦, S[i] - S[j]λ `j+1 ~ i` κΉμ§μ κ΅¬κ° ν©μ΄λ€. - `S[i]%M` κ°κ³Ό `S[j]%M` κ°μ΄ κ°μ κ²½μ°, λλ¨Έμ§ μ°μ°μμ (S[i] - S[j])%Mμ 0μ΄ λλ€.
μ°λ¦¬λ λμ ν©μ ꡬν λλ§λ€ λλ¨Έμ§ μ°μ°μ μ μ©ν κ²°κ³Όλ₯Ό μ΄μ©νλ©΄ λλ€.
λμΆν΄λΈ κ·μΉμ κ°μ§κ³ μμ λ₯Ό μ΄ν΄λ³΄λ©΄,
- λμ ν©: [1, 3, 6, 7, 9]
- λλ¨Έμ§ μ μ₯: [1, 0, 0, 1, 0]
μ΄λ, λλ¨Έμ§κ° 0μΈ κ²½μ° μ²μλΆν° ν΄λΉ μΈλ±μ€κΉμ§μ λμ ν©μ΄ MμΌλ‘ λλμ΄ λ¨μ΄μ§λ€λ μλ―Έμ΄λ―λ‘,
κ²°κ³Ό κ°μ 0μ κ°μλ₯Ό λνλ€.
κ°μ λλ¨Έμ§ λ³λ‘ μ‘°ν©μ ꡬν ν λνλ©΄ λλ€.
- λλ¨Έμ§ 1 = 2κ°, `βCβ` = 1,
- λλ¨Έμ§ 0 = 3κ°, `βCβ` = 3,
λ°λΌμ ꡬκ°μ κ°μλ 3+1+3 = 7 μ΄λ―λ‘ μμ μ κ²°κ³Όκ°κ³Ό λμΌνλ€.
π³ μ 체 μμ€ μ½λ
import java.io.*;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
public class Main{
public static <Set> void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int [] remain = new int[m];
st = new StringTokenizer(br.readLine());
long prev =0;
for(int i = 0; i < n; i++) {
int cur =Integer.parseInt(st.nextToken());
remain[(int) ((prev + cur)%m)]++;
prev +=cur;
}
long count = remain[0];
for(int i = 0; i < m; i++) {
count+= (long) remain[i] *(remain[i]-1) / 2;
}
bw.write(count+"");
bw.flush();
bw.close();
}
}
β λΆλΆ μ½λ μ€λͺ
λ³μ & λ°°μ΄ μ΄κΈ°ν
public class Main{
public static <Set> void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int [] remain = new int[m];
st = new StringTokenizer(br.readLine());
long prev =0;
for(int i = 0; i < n; i++) {
int cur =Integer.parseInt(st.nextToken());
remain[(int) ((prev + cur)%m)]++;
prev +=cur;
}
...
- `n`: μ«μ κ°μ
- `m`: λλλ μ
- `remain[]`: λμ ν©λ³ mμΌλ‘ λλ λλ¨Έμ§ μ μ₯
- `prev`: λμ ν© μ μ₯
prev λ³μλ₯Ό `long` νμ μΌλ‘ μ μΈν μ΄μ β
μ£Όμ΄μ§λ μ«μμ μ΅λ κ°μ΄ 1μ‘°μ΄λ―λ‘ int νμ μΌλ‘ μ μΈ μ μ€λ²νλ‘μ°κ° λ°μ
int : μ½ 21μ΅
long: μ½ 900κ²½
λ°λ³΅λ¬Έμ λλ©΄μ, `λμ ν© (prev) + νμ¬ κ°`μ λλ¨Έμ§λ₯Ό ꡬνκ³ , remain λ°°μ΄μ ν΄λΉ λλ¨Έμ§ κ°μλ₯Ό 1 μ¦κ° νλ€.
κ΅¬κ° κ°μ ꡬνκΈ°
public class Main{
public static <Set> void main(String[] args) throws IOException {
...
long count = remain[0];
for(int i = 0; i < m; i++) {
count+= (long) remain[i] *(remain[i]-1) / 2;
}
bw.write(count+"");
bw.flush();
bw.close();
}
}
- `count`: κ΅¬κ° κ°μ μ μ₯
λλ¨Έμ§κ° 0μΈ κ²½μ° κ·Έ μμ²΄λ‘ mμΌλ‘ λλμ΄ λ¨μ΄μ§λ―λ‘ 0μ κ°μλ‘ countμ λνλ€. - remain λ°°μ΄μ μννλ©΄μ, λλ¨Έμ§ λ³ μ‘°ν© κ°μλ₯Ό ꡬν κ°μ countμ λνλ€.
- count μΆλ ₯ ν νλ‘κ·Έλ¨ μ’ λ£!
π μ‘°ν© κ³΅μ
βCβ = (3*2) / (2*1) = 3
βCβ = (4*3) / (2*1) = 6countλ₯Ό longμΌλ‘ μ μΈν μ΄μ β
nμ κ°μκ° λ°±λ§κ°μ΄κ³ , λλ¨Έμ§ κ°μ΄ μ λΆ λμΌν κ²½μ°, `count β 5μ²μ΅`μ΄λ―λ‘
β¨ κ²°κ³Ό
μ΄ λ¬Έμ μ ν΅μ¬μ λλ¨Έμ§ μ°μ°μ νμ©νλ κ²μ΄λΌκ³ μκ°νλ€.
μ²μ ν λ λλ¨Έμ§ μ°μ°μ λ³ννμ¬ μ κ·Όνλ λ°©μμ μκ°νμ§ λͺ» νμ§λ§,
ν΄λΉ λ¬Έμ λ₯Ό ν΅ν΄ ꡬκ°ν©κ³Ό λλ¨Έμ§ μ°μ°μ λν΄ μ 립 νκ³ κ° μ μμλ€.