LearnToCP
Prijavi se
Navigacija
PočetnaRoad-mapaProblemiO Nama
Teorija
Takmičarsko Znanje
Izbor Radnog Okruženja (IDE)Interaktivni ZadaciOutput-only Zadaci
Osnove
Tvoj Prvi ProgramTipovi podataka, Unos i IzlazC++ sintaksaModuloFunkcijeVektoriMatriceVremenska Složenost Algoritma
Sortiranje
SortiranjeSortiranje PrebrojavanjemRadix Sort
Tehnike Optimizacije
Dva PokazivačaZbir brojeva od 1 do nZbir PrefiksaBinarna PretragaPohlepni AlgoritmiFunkcije Binarne PretrageBinarna Pretraga po RešenjuPodeli, pa Vladaj
Binarni Brojevi
Binarni BrojeviBrojevi u koduOperacije nad BitovimaBitmaske
Matematika
Binarno StepenovanjeProsti BrojeviRastavljanje na proste činioceNZD i NZSEratostenovo SitoModifikovano Sito
Strukture Podataka
Niske (Stringovi)StekRedMapeSkupovi (Set)Red sa PrioritetomKorišćenje Proizvoljnih KriterijumaSegmentna StablaFenvikova StablaSparse TabeleDisjunktni SkupoviSqrt Dekompozicija
Kombinatorika
Pravilo SabiranjaPravilo MnoženjaKombinatorni ObjektiPrincip Uključenja Isključenja
Geometrija
Osnove GeometrijeVektoriVektorski i Skalarni ProizvodLinijePoligoniUgloviTačka u PoligonuRastojanja i Tačke PresekaKonveksni OmotačKrugovi
Rekurzija
PokazivačiRekurzijaGenerisanje Kombinatornih Objekata
Dinamičko Programiranje
O DP-uDP problemiDP nad StablimaDP nad Bitmaskama
Teorija Grafova
GrafoviDFS i BFSNajkraći PuteviStablaTopološko SortiranjeDajkstrin AlgoritamMinimalna Razapinjuća StablaAlgoritmi Najkraćih Puteva
Napredna Teorija Grafova
Dvostruka PovezanostJako Povezane KomponenteBipartitni GrafMaksimalni Protok u GrafuFord-Fulkersonov AlgoritamDualnost Protoka i Minimalnog PresekaTeško-Laka DekompozicijaCentroidna Dekompozicija
Napredne Strukture Podataka
2D i 3D Segmentna StablaLenjo PropagiranjeImplicitna Segmentna StablaPerzistentna Segmentna StablaNajbliži Zajednički PredakTrieBalansirana Binarna Stabla PretrageMoov Algoritam

Modulo

U ovoj lekciji naučićemo kako funkcioniše deljenje, kao i kako da pronađemo ostatak pri deljenju celih brojeva.

Prilikom rešavanja zadataka često moramo da proverimo da li je jedan broj deljiv drugim. Najjednostavniji način da to uradimo jeste korišćenjem modulo operacije.

Šta je modulo?

Modulo je matematička operacija koja nam govori koliki je ostatak nakon deljenja dva cela broja.
U matematici se zapisuje kao a mod b, dok se u c++-u piše kao a % b.

Pogledajmo nekoliko primera:

5 % 2 = 1
100 % 10 = 0
9 % 7 = 2

Dva broja su deljiva ako je njihov modulo jednak 0!

Ako pogledamo više uzastopnih brojeva, možemo primetiti sledeće:

3 % 3 = 0
4 % 3 = 1
6 % 3 = 0
7 % 3 = 1

Kao što možemo videti, rezultati počinju da se ponavljaju.
Takođe možemo primetiti da su pri deljenju brojem n mogući ostaci:

0, 1, 2, 3, ..., n-2, n-1

Drugim rečima: brojevi od 0 do n-1

Implementacija

Korišćenje modulo operacije u c++-u je veoma jednostavno, dovoljno je napisati a % b i dobićemo ostatak pri deljenju.

int main(){

	int a = 5;
	int b = 3;
	
	cout<< a % b;

	return 0;
}

Output: 2

Takođe možemo proveriti da li je jedan broj deljiv drugim pomoću uslova: if(a % b == 0)

Solution.cpp
#include <bits/stdc++.h>

using namespace std;

int main(){

	cin.tie(0);
	ios_base::sync_with_stdio(false);
	
	int a,b;
	
	cin>>a>>b;
	
	if(a % b ==0){
		cout<<"Brojevi JESU deljivi";
	}else{
		cout<<"Brojevi NISU deljivi";
	}
	
	return 0;
}

Input: 100 3
Output: Brojevi NISU deljivi

Input: 100 5
Output: Brojevi JESU deljivi

Pravila modulo operacije

U mnogim zadacima rešenje je ogroman broj, pa se u postavci traži da ispišemo rezultat po modulu nekog broja (najčešće 1000000007). Umesto da prvo izračunamo ogroman broj pa tek na kraju uzmemo ostatak (što bi izazvalo prekoračenje), uzimamo ostatak posle svake operacije.

To radi zbog sledećih pravila:

Sabiranje
(a + b) % m = (a % m + b % m) % m

Oduzimanje
(a - b) % m = (a % m - b % m + m) % m

Množenje
(a * b) % m = ((a % m) * (b % m)) % m

Stepenovanje
(a^b) % m = ((a % m)^b) % m