natjecateljsko programiranje luka kalinovčić, kalinovcic@gmail
TRANSCRIPT
� (A+B) mod M (A+B) mod M (A+B) mod M (A+B) mod M ≡≡≡≡ ((A mod M)+(B mod M)) mod M((A mod M)+(B mod M)) mod M((A mod M)+(B mod M)) mod M((A mod M)+(B mod M)) mod M
◦ (4+8) mod 3 (4+8) mod 3 (4+8) mod 3 (4+8) mod 3 = (1+2) mod 3 = 3 mod 3 = 0= (1+2) mod 3 = 3 mod 3 = 0= (1+2) mod 3 = 3 mod 3 = 0= (1+2) mod 3 = 3 mod 3 = 0
� (A(A(A(A−−−−B) mod M B) mod M B) mod M B) mod M ≡≡≡≡ ((A mod M)((A mod M)((A mod M)((A mod M)−−−−(B mod M)) mod M(B mod M)) mod M(B mod M)) mod M(B mod M)) mod M◦ (4(4(4(4−−−−8) mod 3 = (18) mod 3 = (18) mod 3 = (18) mod 3 = (1−−−−2) mod 3 = 2) mod 3 = 2) mod 3 = 2) mod 3 = ----1 mod 3 = 21 mod 3 = 21 mod 3 = 21 mod 3 = 2
� (A(A(A(A····B) mod M B) mod M B) mod M B) mod M ≡≡≡≡ ((A mod M) ((A mod M) ((A mod M) ((A mod M) ···· (B mod M)) mod M(B mod M)) mod M(B mod M)) mod M(B mod M)) mod M◦ (4(4(4(4····8) mod 3 = (18) mod 3 = (18) mod 3 = (18) mod 3 = (1····2) mod 3 = 2 mod 3 = 22) mod 3 = 2 mod 3 = 22) mod 3 = 2 mod 3 = 22) mod 3 = 2 mod 3 = 2
� (A/B) mod M (A/B) mod M (A/B) mod M (A/B) mod M ≡≡≡≡ ????????????
� (A/B) mod M (A/B) mod M (A/B) mod M (A/B) mod M ≡≡≡≡ ????????????
� Neka je P prost brojNeka je P prost brojNeka je P prost brojNeka je P prost broj
� (A/B) mod P (A/B) mod P (A/B) mod P (A/B) mod P ≡≡≡≡ (A(A(A(A····BBBB----1111) mod P) mod P) mod P) mod P
� xxxxPPPP----1111 mod P mod P mod P mod P ≡≡≡≡ 1111
� (x(x(x(x····xxxxPPPP----2222) mod P ) mod P ) mod P ) mod P ≡≡≡≡ 1111
� xxxxPPPP----2222 ≡≡≡≡ xxxx----1111
◦ xxxxPPPP----2 2 2 2 je modularni inverz broja x (modulo P)!je modularni inverz broja x (modulo P)!je modularni inverz broja x (modulo P)!je modularni inverz broja x (modulo P)!
� (A/B) mod P (A/B) mod P (A/B) mod P (A/B) mod P ≡≡≡≡ (A(A(A(A····BBBBPPPP----2222) mod P) mod P) mod P) mod P
� LaganoLaganoLaganoLagano
MOD = 31337;
x1 = A % MOD;
x2 = B % MOD;
for( int i = 0; i < K-2; ++i ) {
int x3 = ((long long)C*A +
(long long)D*B +
E) % MOD;
x1 = x2;
x2 = x3;
}
� VlakiVlakiVlakiVlakićććć
� Permutacije s ponavljanjPermutacije s ponavljanjPermutacije s ponavljanjPermutacije s ponavljanjimaimaimaima::::
( )6024mod
!!!
!⋅
++
CBA
CBA
� Dijeljenje!Dijeljenje!Dijeljenje!Dijeljenje! Kako izraKako izraKako izraKako izraččččunati?unati?unati?unati?
� Zapisati brojnik i nazivnik kao umnožak faktora.
� Pokratiti sve što se može.
� Kako znamo da je rješenje cijeli broj, sigurno ćemo sve brojeve u nazivniku pokratiti.
� Pomnožiti brojeve u brojniku
( )
32132121
87654321
!3!3!2
!332
⋅⋅⋅⋅⋅⋅⋅
⋅⋅⋅⋅⋅⋅⋅=
++
ret = 1;
for( int i = 0; i < A+B+C; ++i ) {
for( int j = 0; j < A+B+C; ++j ) {
int g = gcd( gore[i], dole[j] );
gore[i] /= g;
dole[j] /= g;
}
ret = (ret * gore[i]) % (24*60);
}
� (A(A(A(ANNNN) mod M ) mod M ) mod M ) mod M ≡≡≡≡ ??? ??? ??? ???
� Rekurzivna metodaRekurzivna metodaRekurzivna metodaRekurzivna metoda
� AAAA2009200920092009 = A = A = A = A ···· AAAA2008200820082008
� AAAA2008200820082008 = A= A= A= A1004100410041004 ···· AAAA1004100410041004
� AAAA1004100410041004 = A= A= A= A502502502502 ···· AAAA502502502502
� AAAA502502502502 = A= A= A= A251251251251 ···· AAAA251251251251
� AAAA251251251251 = A = A = A = A ···· AAAA250250250250
�…………
� SloSloSloSložžžženost O(log N)enost O(log N)enost O(log N)enost O(log N)
� Iterativna metodaIterativna metodaIterativna metodaIterativna metoda
� AAAA2009200920092009 = = = = AAAA1024102410241024 ···· AAAA512512512512 ···· AAAA256256256256 ···· AAAA128128128128 ···· AAAA64646464 ···· AAAA16161616 ···· AAAA8888 ···· AAAA1111
ret = 1;
while( n > 0 ) {
if( n % 2 == 1 ) ret = ret * A % M;
A = A * A % M;
n = n / 2;
} OVERFLOW? long long!OVERFLOW? long long!OVERFLOW? long long!OVERFLOW? long long!
� SloSloSloSložžžženost O(log N), ali brenost O(log N), ali brenost O(log N), ali brenost O(log N), ali bržžžže ode ode ode od
rekurzivne metoderekurzivne metoderekurzivne metoderekurzivne metode
� ((((1 + A + 1 + A + 1 + A + 1 + A + AAAA2222 + ... + + ... + + ... + + ... + AAAANNNN) mod M ) mod M ) mod M ) mod M ≡≡≡≡ ??? ??? ??? ???
� Rekurzivno rjeRekurzivno rjeRekurzivno rjeRekurzivno rješšššenjeenjeenjeenje
� Za parne N:Za parne N:Za parne N:Za parne N:◦ 1 + A + 1 + A + 1 + A + 1 + A + AAAA2222 + ... + + ... + + ... + + ... + AAAANNNN = 1 + A= 1 + A= 1 + A= 1 + A····((((1 + A + 1 + A + 1 + A + 1 + A + AAAA2222 + ... + + ... + + ... + + ... + AAAANNNN----1111))))
� Za neparne N:Za neparne N:Za neparne N:Za neparne N:◦ B = AB = AB = AB = A2222
◦ 1 + A + 1 + A + 1 + A + 1 + A + AAAA2222 + ... + + ... + + ... + + ... + AAAANNNN ====
◦ = (= (= (= (1 + 1 + 1 + 1 + AAAA2222 + ... + + ... + + ... + + ... + AAAANNNN----1111) + (A + A) + (A + A) + (A + A) + (A + A3333 + ... + + ... + + ... + + ... + AAAANNNN) =) =) =) =
◦ = (= (= (= (1 + 1 + 1 + 1 + AAAA2222 + ... + + ... + + ... + + ... + AAAANNNN----1111) + A) + A) + A) + A····((((1 + 1 + 1 + 1 + AAAA2222 + ... + + ... + + ... + + ... + AAAANNNN----1111) = ) = ) = ) =
◦ = (1 + A)= (1 + A)= (1 + A)= (1 + A)····((((1 + 1 + 1 + 1 + AAAA2222 + + + + AAAA4444 + ... + + ... + + ... + + ... + AAAANNNN----1111) =) =) =) =
◦ = (1 + A)= (1 + A)= (1 + A)= (1 + A)····((((1 + 1 + 1 + 1 + BBBB ++++ BBBB2222 + + + + ... + ... + ... + ... + BBBB(N(N(N(N----1)/21)/21)/21)/2))))
� Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)
1683168316831683 873873873873
� Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)
1683168316831683 873873873873
1111
� Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)
1683168316831683 873873873873 810810810810
1111
� Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)
1683168316831683 873873873873 810810810810
1111 1111
� Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)
1683168316831683 873873873873 810810810810 63636363
1111 1111
� Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)
1683168316831683 873873873873 810810810810 63636363
1111 1111 12121212
� Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)
1683168316831683 873873873873 810810810810 63636363 54545454
1111 1111 12121212
� Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)
1683168316831683 873873873873 810810810810 63636363 54545454 9999
1111 1111 12121212 1111
� Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)
1683168316831683 873873873873 810810810810 63636363 54545454 9999 0000
1111 1111 12121212 1111 6666
Uvjet za prekidUvjet za prekidUvjet za prekidUvjet za prekid
Rezultat!Rezultat!Rezultat!Rezultat!
GCD(1683, 873)GCD(1683, 873)GCD(1683, 873)GCD(1683, 873) = 9= 9= 9= 9
gcd( A, B ) {
r1 = A;
r2 = B;
while( r2 != 0 ) {
q = r1 / r2;
r3 = r1 – q*r2;
r1 = r2;
r2 = r3;
}
return r1;
}
int gcd( int A, int B ) {
if( B == 0 ) return A;
else return gcd( B, A%B );
}
return B ? gcd( B, A%B ) : A;
� Rekurzivna implementacijaRekurzivna implementacijaRekurzivna implementacijaRekurzivna implementacija
� ………… ili ili ili ili …………
� Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)
1683168316831683 873873873873
1111 0000
0000 1111
1111····1683 + 01683 + 01683 + 01683 + 0····873 873 873 873 = 1683= 1683= 1683= 1683
0000····1683 + 1683 + 1683 + 1683 + 1111····873 873 873 873 = 873= 873= 873= 873
� Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)
1683168316831683 873873873873 810810810810
1111
1111 0000 1111
0000 1111 ----1111
1111····1683 1683 1683 1683 −−−− 1111····873 873 873 873 = 810= 810= 810= 810
� Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)
1683168316831683 873873873873 810810810810 63636363
1111 1111
1111 0000 1111 ----1111
0000 1111 ----1111 2222
----1111····1683 1683 1683 1683 + 2+ 2+ 2+ 2····873 873 873 873 = 63= 63= 63= 63
� Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)
1683168316831683 873873873873 810810810810 63636363 54545454
1111 1111 12121212
1111 0000 1111 ----1111 13131313
0000 1111 ----1111 2222 ----25252525
13131313····1683 1683 1683 1683 −−−− 25252525····873 873 873 873 = 54= 54= 54= 54
� Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)
1683168316831683 873873873873 810810810810 63636363 54545454 9999
1111 1111 12121212 1111
1111 0000 1111 ----1111 13131313 ----14141414
0000 1111 ----1111 2222 ----25252525 27272727
----14141414····1683 1683 1683 1683 + 27+ 27+ 27+ 27····873 873 873 873 = 54= 54= 54= 54
� Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)Primjer: GCD(1683, 873)
1683168316831683 873873873873 810810810810 63636363 54545454 9999 0000
1111 1111 12121212 1111 6666
1111 0000 1111 ----1111 13131313 ----14141414
0000 1111 ----1111 2222 ----25252525 27272727
----14141414····1683 1683 1683 1683 + 27+ 27+ 27+ 27····873 873 873 873 = 54= 54= 54= 54
extended_gcd( A, B ) {
r1 = A; x1 = 1; y1 = 0;
r2 = B; x2 = 0; y2 = 1;
while( r2 != 0 ) {
q = r1 / r2;
r3 = r1 – q*r2;
x3 = x1 – q*x2;
y3 = y1 – q*y2;
r1 = r2; x1 = x2; y1 = y2;
r2 = r3; x2 = x3; y2 = y3;
}
// vrijedi: x1*A + y1*B == r1
}
� Primjena:Primjena:Primjena:Primjena:
� RjeRjeRjeRješšššavanje modularnih jednadavanje modularnih jednadavanje modularnih jednadavanje modularnih jednadžžžžbi:bi:bi:bi:
� 7x 7x 7x 7x ≡≡≡≡ 4 (mod 17)4 (mod 17)4 (mod 17)4 (mod 17)
� 7x + 17y 7x + 17y 7x + 17y 7x + 17y = = = = 4444
� ProProProProšššširenim irenim irenim irenim Euklidovim algoritEuklidovim algoritEuklidovim algoritEuklidovim algoritom nađemo om nađemo om nađemo om nađemo rjerjerjerješšššenje enje enje enje temeljne jednadtemeljne jednadtemeljne jednadtemeljne jednadžžžžbe 7be 7be 7be 7xxxx’’’’ + 17+ 17+ 17+ 17yyyy’’’’ = 1= 1= 1= 1::::◦ 7777····5 5 5 5 + 17+ 17+ 17+ 17····((((----2)2)2)2) = 1= 1= 1= 1
� MnoMnoMnoMnožžžžimo s 4imo s 4imo s 4imo s 4◦ 7777····20202020 + 17+ 17+ 17+ 17····((((----8)8)8)8) = 4= 4= 4= 4
� Zaista: 7Zaista: 7Zaista: 7Zaista: 7····20202020 ≡≡≡≡ 4 (mod 17)4 (mod 17)4 (mod 17)4 (mod 17)
� Fibonaccijev niz:Fibonaccijev niz:Fibonaccijev niz:Fibonaccijev niz:◦ F[0] = 1F[0] = 1F[0] = 1F[0] = 1
◦ F[1] = 1F[1] = 1F[1] = 1F[1] = 1
◦ FFFF[k] = F[k[k] = F[k[k] = F[k[k] = F[k----1] + F[k1] + F[k1] + F[k1] + F[k----2]2]2]2]
� Cilj je pronaCilj je pronaCilj je pronaCilj je pronaćććći matricu koja i matricu koja i matricu koja i matricu koja ćććće vektor e vektor e vektor e vektor
transformirati u vektortransformirati u vektortransformirati u vektortransformirati u vektor
−
−
1]F[k
2]F[k
−
F[k]
1]F[k
� Fibonaccijev niz:Fibonaccijev niz:Fibonaccijev niz:Fibonaccijev niz:◦ F[0] = 1F[0] = 1F[0] = 1F[0] = 1
◦ F[1] = 1F[1] = 1F[1] = 1F[1] = 1
◦ FFFF[k] = F[k[k] = F[k[k] = F[k[k] = F[k----1] + F[k1] + F[k1] + F[k1] + F[k----2]2]2]2]
−
−
1]F[k
2]F[k
−
F[k]
1]F[k
??
??
� Fibonaccijev niz:Fibonaccijev niz:Fibonaccijev niz:Fibonaccijev niz:◦ F[0] = 1F[0] = 1F[0] = 1F[0] = 1
◦ F[1] = 1F[1] = 1F[1] = 1F[1] = 1
◦ FFFF[k] = F[k[k] = F[k[k] = F[k[k] = F[k----1] + F[k1] + F[k1] + F[k1] + F[k----2]2]2]2]
−
−
1]F[k
2]F[k
−
F[k]
1]F[k
11
10
=
×
F[2]
F[1]
F[1]
F[0]
11
10
=
×
=
×
×
F[3]
F[2]
F[2]
F[1]
11
10
F[1]
F[0]
11
10
11
10
+=
×
1]F[k
F[k]
F[1]
F[0]
11
10k
� PrimjerPrimjerPrimjerPrimjer 1:1:1:1:◦ F[0] = 0F[0] = 0F[0] = 0F[0] = 0
◦ F[1] = 0F[1] = 0F[1] = 0F[1] = 0
◦ FFFF[k] = 2[k] = 2[k] = 2[k] = 2····F[kF[kF[kF[k----1] 1] 1] 1] −−−− F[kF[kF[kF[k----2] + 52] + 52] + 52] + 5
−
−
1]F[k
2]F[k
−
F[k]
1]F[k
??
??
Trebamo u stanje dodati Trebamo u stanje dodati Trebamo u stanje dodati Trebamo u stanje dodati konstantu 1!konstantu 1!konstantu 1!konstantu 1!
� PrimjerPrimjerPrimjerPrimjer 1:1:1:1:◦ F[0] = 0F[0] = 0F[0] = 0F[0] = 0
◦ F[1] = 0F[1] = 0F[1] = 0F[1] = 0
◦ FFFF[k] = 2[k] = 2[k] = 2[k] = 2····F[kF[kF[kF[k----1] 1] 1] 1] −−−− F[kF[kF[kF[k----2] + 52] + 52] + 52] + 5
−
−
1
1]F[k
2]F[k
−
1
F[k]
1]F[k
???
???
???
� PrimjerPrimjerPrimjerPrimjer 1:1:1:1:◦ F[0] = 0F[0] = 0F[0] = 0F[0] = 0
◦ F[1] = 0F[1] = 0F[1] = 0F[1] = 0
◦ FFFF[k] = 2[k] = 2[k] = 2[k] = 2····F[kF[kF[kF[k----1] 1] 1] 1] −−−− F[kF[kF[kF[k----2] + 52] + 52] + 52] + 5
−
−
1
1]F[k
2]F[k
−
1
F[k]
1]F[k
100
521-
010
� PrimjerPrimjerPrimjerPrimjer 2:2:2:2:◦ F[0] = 0F[0] = 0F[0] = 0F[0] = 0
◦ F[1] = 0F[1] = 0F[1] = 0F[1] = 0
◦ FFFF[k] = 2[k] = 2[k] = 2[k] = 2····F[kF[kF[kF[k----1] 1] 1] 1] −−−− F[kF[kF[kF[k----2] + 52] + 52] + 52] + 5
◦ IzraIzraIzraIzraččččunajte Funajte Funajte Funajte F[0] + F[1] + F[2] + [0] + F[1] + F[2] + [0] + F[1] + F[2] + [0] + F[1] + F[2] + ………… + F[n]+ F[n]+ F[n]+ F[n]
� RjeRjeRjeRješšššenje: niz Senje: niz Senje: niz Senje: niz S pamti sumupamti sumupamti sumupamti sumu◦ SSSS[0] = 0[0] = 0[0] = 0[0] = 0
◦ S[k] = S[kS[k] = S[kS[k] = S[kS[k] = S[k----1] + F[k]1] + F[k]1] + F[k]1] + F[k]
� S[k] = S[kS[k] = S[kS[k] = S[kS[k] = S[k----1] + 21] + 21] + 21] + 2····F[kF[kF[kF[k----1] 1] 1] 1] −−−− F[kF[kF[kF[k----2] + 52] + 52] + 52] + 5
� PrimjerPrimjerPrimjerPrimjer 2:2:2:2:◦ F[0] = 0F[0] = 0F[0] = 0F[0] = 0
◦ F[1] = 0F[1] = 0F[1] = 0F[1] = 0
◦ FFFF[k] = 2[k] = 2[k] = 2[k] = 2····F[kF[kF[kF[k----1] 1] 1] 1] −−−− F[kF[kF[kF[k----2] + 52] + 52] + 52] + 5
◦ S[k] = S[kS[k] = S[kS[k] = S[kS[k] = S[k----1] + 21] + 21] + 21] + 2····F[kF[kF[kF[k----1] 1] 1] 1] −−−− F[kF[kF[kF[k----2] + 52] + 52] + 52] + 5
� Vektor stanja:Vektor stanja:Vektor stanja:Vektor stanja:
−
−
−
1
1]S[k
1]F[k
2]F[k
� PrimjerPrimjerPrimjerPrimjer 2:2:2:2:◦ F[0] = 0F[0] = 0F[0] = 0F[0] = 0
◦ F[1] = 0F[1] = 0F[1] = 0F[1] = 0
◦ FFFF[k] = 2[k] = 2[k] = 2[k] = 2····F[kF[kF[kF[k----1] 1] 1] 1] −−−− F[kF[kF[kF[k----2] + 52] + 52] + 52] + 5
◦ S[k] = S[kS[k] = S[kS[k] = S[kS[k] = S[k----1] + 21] + 21] + 21] + 2····F[kF[kF[kF[k----1] 1] 1] 1] −−−− F[kF[kF[kF[k----2] + 52] + 52] + 52] + 5
−
−
−
1
1]S[k
1]F[k
2]F[k
−
1
S[k]
F[k]
1]F[k
1000
5121-
5021-
0010