İçeriğe atla
ΣDSA Patterns
Menü
Dil

Temeller

Modüler aritmetik

Mod, kongrüanslar, tersler, Fermat - hashing ve prefix-mod DP’nin temeli.

Soru: 23 elemanlı bir dizide toplamı 5’e bölünen kaç alt dizi var?

Naif O(n²) 530 çifti dolaşır. Ama mod 5 kalanlarına bakarsan O(n)’e inersin. Bu sayfa, modüler aritmetiğin hash map’lerden prefix-mod DP’ye nerelerde devreye girdiğini açar.

Sayılarla: mod bir saat gibidir

(a + b) mod m, saatin üzerinde ilerler. m = 12 için 10 + 5 = 3 (gece yarısından 5 saat sonra). mod m her zaman 0..m-1 aralığında kalır. Saati döndür ve sonucun nasıl döneceğini izle.

Özellikler (mülakatta hızlı hatırla):

Türetme: prefix-mod ile alt dizi sayma

Hedef: toplamı K’ya bölünen alt dizi sayısı. prefix[i] = nums[0] + … + nums[i-1]tanımla. Alt dizi [l, r]’nin toplamı prefix[r+1] - prefix[l]. Bu, K’ya bölünür demek (prefix[r+1] - prefix[l]) mod K == 0, yaniprefix[r+1] ≡ prefix[l] (mod K).

Yani: aynı kalanlara sahip prefix’leri say. count[r] = kalan prefix[r]’den kaç önce. Her kalan için kaç kez görüldüğünü bir hash map’ta tut, toplamı topla → O(n).

Örnek: nums = [4, 5, 0, -2, -3, 1], K = 5. Prefix mod 5’ler:0, 4, 4, 4, 2, 4, 0. Aynı kalan çiftleri: (0,0), (4,4)’ten 3’er, (4,4)’ten daha fazla → toplam 7. LC 974’ün çözümü budur.

Tuzak: “negatif sayılarda mod yanlış çalışır”

Dikkat: -7 mod 5 Python’da 3 verir ama C# / TypeScript’te -7 % 5 = -2. Negatif kalanları pozitife çek: ((x % K) + K) % K. Prefix-mod DP’de bu klasik hata; negatif sayılar içeren dizilerde kalanları yanlış gruplarsın.

Sıradaki adım

Alıştırma

Saatte a = 8, b = 9, m = 12 ayarla. Sonucu tahmin et (17 mod 12). Şimdi m = 5’e geçir. Bu, mod’ün sadece “bölme kalanı” değil, sayıyı bir halkaya (ring) sarmanın neden işe yaradığını gösterir.

012345678910117+5
(7 + 5) mod 12 = 0Sonuç

← Tüm matematik konuları →