natjecateljsko programiranje luka kalinovčić, kalinovcic@gmail

44
Natjecateljsko programiranje Luka Kalinovčić, [email protected]

Upload: others

Post on 25-Jan-2022

1 views

Category:

Documents


0 download

TRANSCRIPT

Natjecateljsko programiranje

Luka Kalinovčić, [email protected]

Osnove

Domaća zadaća

� (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);

}

Brzo potenciranje

Geometrijski niz

� (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))))

Euklidov algoritam

Prošireni Euklidov algoritam

� 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)

Množenje matrica

Linearne diferencijske jednadžbe

∑ ⋅= ),(),(),( jkBkiAjiC

112

211

33

12

21

969

534

435

=

×

112

211

33

12

21

� 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