infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Adrian Diaconu din Octombrie 14, 2007, 21:21:29



Titlul: 509 Functii
Scris de: Adrian Diaconu din Octombrie 14, 2007, 21:21:29
Aici puteţi discuta despre problema Functii (http://infoarena.ro/problema/functii).


Titlul: Răspuns: 509 Functii
Scris de: Florian Marcu din Octombrie 21, 2007, 12:35:10
Cod:
 Ea [b]trebui[/b] sa numere cate functii surjective definite pe multimea { 1,2,3,4..n } cu valori in multimea numerelor { 0,-1,1 } [i]exista[/i] astfel incat |f(1)| + |f(2)| + .. |f(n)| =S (toate sunt in modul) . 

Cuvantul "exista" e pus de la mine... Cred k ar trebui reparate aceste 2 greseli.  :)


Titlul: Răspuns: 509 Functii
Scris de: Savin Tiberiu din Octombrie 21, 2007, 13:01:44
enuntul a fost modificat. De asemenea a fost modificata o restrictie (oops  :oops:). Imi cer scuze ptr cei care s-au chinuit sa rezolve problema si au luat 0 din cauza enuntului.


Titlul: Răspuns: 509 Functii
Scris de: Ionescu Vlad din Octombrie 21, 2007, 14:52:29
Cum se poate calcula o expresie de genul [(x^y)-k] % p? Sau trebuie numere mari pt efectuarea ridicarii la putere?


Titlul: Răspuns: 509 Functii
Scris de: Savin Tiberiu din Octombrie 21, 2007, 16:02:35
Cod:
rest= x^y%p;
rest-=k;
while (rest<0) rest+=p;


Titlul: Răspuns: 509 Functii
Scris de: Stefan Istrate din Octombrie 21, 2007, 16:13:00
Sau ca sa eviti while-ul:
Cod:
rest=(x^y)%p;
rest-=k%p;
if(rest<0) rest+=p;


Titlul: Răspuns: 509 Functii
Scris de: Sebastian Crisan din Octombrie 21, 2007, 16:26:13
Cand trimit o sursa imi apare eroarea
Citat
Eroare de compilare in evaluator:
sh: g++: command not found



Titlul: Răspuns: 509 Functii
Scris de: Adrian Diaconu din Octombrie 21, 2007, 17:06:31
Ar trebui sa se fi rezolvat problema acum.

Daca mai apare vreo chestie ciudata nu ezitati sa semnalati.


Titlul: Răspuns: 509 Functii
Scris de: Savin Tiberiu din Octombrie 21, 2007, 17:31:53
S-a mai modificat odata enuntul. Rezultatul trebuie afisat modulo 30103. Scuze  :oops:


Titlul: Răspuns: 509 Functii
Scris de: Ionescu Vlad din Octombrie 21, 2007, 17:52:18
In sfarsit... habar n-aveam de la ce primeam WA...


Titlul: Răspuns: 509 Functii
Scris de: Florian Marcu din Iunie 05, 2008, 15:50:19
Care e cea mai rapida metoda de a calcula Comb(n,k) la problema asta? Am vazut ca in complexitate O(n*k) nu intra in timp...


Titlul: Răspuns: 509 Functii
Scris de: Alexandru B. din Iunie 05, 2008, 16:58:43
E o problema...

Nu se poate unui X sa apartina mai multe Y..ori asta s ar intampla daca X ar fi mai mic ca Y cum e in ex vostru..intervalul 1 < n < 10000 e prost facut

Floryan a vazut asta primul...


Titlul: Răspuns: 509 Functii
Scris de: Savin Tiberiu din Iunie 05, 2008, 17:21:44
@florian: daca ti-ai face o matrice C[ i ][ j ] - combinari de i luate cate j, ai putea calcula independent fiecare linie in o(n). Gandestete cum ai putea sa scoti din C[ i ][ j ] pe C[ i ][ j+1 ]

@Alexandru_B: Nu e prost facut intervalul. Daca nu poate exista o functie ptr care proprietatile din enunt sa fie indeplinite mie mi se pare normal ca raspunsul sa fie 0.


Titlul: Răspuns: 509 Functii
Scris de: Alexandru B. din Iunie 05, 2008, 17:48:42
Ok...scz credeam ca pur si simplu nu are cazuri imposibile.
Ce matrice este aia C[j]?


Titlul: Răspuns: 509 Functii
Scris de: Florian Marcu din Iunie 05, 2008, 17:59:42
@florian: daca ti-ai face o matrice C[ i ][ j ] - combinari de i luate cate j, ai putea calcula independent fiecare linie in o(n). Gandestete cum ai putea sa scoti din C[ i ][ j ] pe C[ i ][ j+1 ]

Nu prea am inteles ce vrei sa spui... Clasic se rezolva cu c[ i ][ j ]=c[ i-1 ][ j ]+c[ i-1 ][ j-1 ]. Eventual se reduce memoria, utilizand doar doi vectori [pt ultimile 2 linii]. Aceasta rezolvare are complexitate O(N*K) si nu intra in timp. Poti detalia putin ideea ta...?  :)


Titlul: Răspuns: 509 Functii
Scris de: Stefan Istrate din Iunie 05, 2008, 18:11:18
Tie iti trebuie doar restul la impartirea cu 30103 (numar prim). Poti sa precalculezi resturile factorialelor, iar pentru combinari folosesti definitia: C(N, K) = N! / (K! * (N - K)!). Inmultesti un numar cu 2 inverse modulare ale celorlalte.


Titlul: Răspuns: 509 Functii
Scris de: Florian Marcu din Iunie 05, 2008, 18:48:14
Ok. Va multumesc amandorura pentru raspunsuri.
@devilkind : astept sa vii cu o explicatie putin mai detaliata... pare interesant ce ai spus, dar nu ma prind.

Apropop de inverse modulare. Nu am lucrat niciodata si cred ca e timpul sa ma apuc. Sper sa nu fiu prea offtopic.
Sa consideram o formula mai simpla, deci sa zicem ca am de calculat ( X/Y ) % P. In loc sa calculez impartirea, mai bine inmultesc X cu inversul lui Y. Inversul lui Y (de la mate) este 1/Y. Dar acum apare Fermat si spune ca X^(P-1) % P = 1 => X^(-1)=X(P-2) (mod P). Asadar, inversul lui Y [din formula noastra] devine Y^(P-2). Asadar, problema se reduce la egalitatea:

.                                     X/Y = X * Y^(P-2) ( mod P)

Iar in cazul problemei "functii", X este n!, iar Y este k! (si apoi (n-k)! ), iar P este 30103.

Cam asta stiam eu.. insa nu am lucrat niciodata cu asta. E bine ce am spus ? Daca am gresit in vreun loc, va rog sa imi spuneti. Multumesc!  :ok:



Titlul: Răspuns: 509 Functii
Scris de: Savin Tiberiu din Iunie 05, 2008, 19:03:57
C(n,k)= n!/k!*(n-k)! = n!/( (k-1)!*(n-k+1)! )   * (n-k+1)/k = C(n,k-1) * (n-k+1)/k


Titlul: Răspuns: 509 Functii
Scris de: Stefan Istrate din Iunie 05, 2008, 19:07:42
Cam asta stiam eu.. insa nu am lucrat niciodata cu asta. E bine ce am spus ? Daca am gresit in vreun loc, va rog sa imi spuneti.
E corect.


Titlul: Răspuns: 509 Functii
Scris de: Florian Marcu din Iunie 05, 2008, 20:25:09
C(n,k)= n!/k!*(n-k)! = n!/( (k-1)!*(n-k+1)! )   * (n-k+1)/k = C(n,k-1) * (n-k+1)/k

Interesanta idee. E bn de stiut lucrul asta. Multumesc.  :D
 
Multumesc si tie, Stefan Istrate.  :ok:


Titlul: Răspuns: 509 Functii
Scris de: Carabet Cosmin Andrei din August 13, 2009, 19:43:28
Salut.Am o nelamurire la problema asta.Eu m-am gandit cam asa:
E clar ca daca |f(1)| + |f(2)| + .. |f(n)| =S exista fix S din cele n valori din domeniu egale cu 1 sau -1 si mai sunt deci n-S valori de 0.Ca functiile cautate sa fie sigur surjective Aleg cate o valoare de 1 si de -1(e garantat faptul ca vor fi zerouri).Sunt n*(n-1)posibilitati de alegere a celor 2 valori de 1 si -1.Pe urma au mai ramas S-2 valori de 1 sau -1 de pus.Sunt comb[n-2][S-2] metode de a alege o configuratie de S-2 valori din n-2 posibile.Pentru fiecare configuratie sunt 2^(S-2) metode de a alege 1 sau -1.
Ca urmare => rezultatul cautat ar trebui sa fie : n*(n-1)*comb[n-2][S-2]*2^(S-2) ,avand grija la operatiile in modul. Pe exemplu n=5,S=3 => inlocuind: 5*4*comb[3][1]*2^1=5*4*3*2=120 ,nu 60. Poate cineva sa ma lamureasca unde gresesc in rationament?  :-k


Titlul: Răspuns: 509 Functii
Scris de: Tudor Costin Razvan din Aprilie 10, 2014, 13:30:01
Imi puteti da si mie o functie invmodular(x)??? Ca nu inteleegg


Titlul: Răspuns: 509 Functii
Scris de: Alexandru Valeanu din Aprilie 10, 2014, 13:35:20
Despre invers modular poti citi aici: http://www.infoarena.ro/problema/inversmodular.


Titlul: Răspuns: 509 Functii
Scris de: Vozian Valentin din Iunie 07, 2016, 12:03:22
poate cineva sa-mi explice de ce 60 dar nu 80? problema consta in cate combinari de {1,0,-1} luate cate N exista astfel incat suma modulelor lor sa fie S sau eu ceva nu am inteles corect? dupa logica mea ar trebui sa fie C(N,K)*2^K. ](*,)


Titlul: Răspuns: 509 Functii
Scris de: Valeriu Motroi din Iunie 07, 2016, 12:56:34
nu e chiar 2^K (unde K == sum)

e (2^K)-2

1) excluzi mulțimea vidă
2) surjectivitatea înseamnă că trebuie să ai valori și de -1 și de 0 și de 1, cu alte cuvinte n-ai voie să ai doar 0 și 1 sau doar 0 și -1