infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Adrian Diaconu din Octombrie 17, 2007, 23:44:39



Titlul: 519 Modulo
Scris de: Adrian Diaconu din Octombrie 17, 2007, 23:44:39
Aici puteţi discuta despre problema Modulo (http://infoarena.ro/problema/modulo).


Titlul: Răspuns: 519 Modulo
Scris de: Ionescu Vlad din Octombrie 18, 2007, 11:58:56
Nu e cam mult o secunda la problema asta? :-'


Titlul: Răspuns: 519 Modulo
Scris de: Adrian Diaconu din Octombrie 18, 2007, 16:32:14
Limita a fost micsorata la 0.1. Solutiile au fost reevaluate.


Titlul: Răspuns: 519 Modulo
Scris de: Hasna Robert din Octombrie 20, 2007, 14:42:50
care e faza cu testul 7 ?. iau wa la el.
Idee : a%=c, b%=c; rez=1; for (i=1; i<=b; i++) rez=(rez*a)%c; si apoi afisez rez.
am crezut ca nu imi intra in tipuri standard, am bagat si nr mari , am incercat si pe long long si cu long double( cu conversii la fiecare pass), si tot la 90 pct ajunge.

b nu poate fi e sa zic sa nu imi intre deloc in for, si chiar daca ar fi fost 0 tot ar da rez bun ca ar ramane rez==1;

ma scoate din mintzi  :fighting:. pls help


Titlul: Răspuns: 519 Modulo
Scris de: HighScore din Octombrie 20, 2007, 15:11:16
pt a=4, b=4, c=4 iti afiseaza 1, iar rez e 0...deci e doar o coincidenta ca iei atat de mult, deoarece (a^b)mod(c) nici in o mie de ani nu va fi (a mod c)^(b mod c), adica principiu pe care spui tu ca te bazezi


Titlul: Răspuns: 519 Modulo
Scris de: Hasna Robert din Octombrie 20, 2007, 17:07:56
stiu ca e o coincidentza, prima data cand am trimis sursa care facea pana la b mod c m-am si mirat ca am luat 70, apoi am bagat long long si am luat 90 si am crezut ca o fi bine.am lasat pana la b prima data si iau 60 pct si 4 tle. oricum algoritmul meu nu e bun. imi poti da ceva indicatii cum se rezolva?


Titlul: Răspuns: 519 Modulo
Scris de: Adrian Diaconu din Octombrie 20, 2007, 19:45:46
Cea mai la indemana metoda este sa te gandesti cum poti calcula ab cunoscand ab/2. Apoi pentru calculul lui ab/2 aplici acelasi rationament.


Titlul: Răspuns: 519 Modulo
Scris de: Hasna Robert din Octombrie 25, 2007, 22:26:29
Ms de ajutor.Am luat pana la urma 100 :D.


Titlul: Răspuns: 519 Modulo
Scris de: Farcasanu Alexandru Ciprian din Ianuarie 04, 2008, 16:35:37
Pf...care poate sa-mi explice mai clar principiul cu care rezolv problema asta...ca nu inteleg...


Titlul: Răspuns: 519 Modulo
Scris de: Airinei Adrian din Ianuarie 04, 2008, 16:50:40
Exact cum a spus Ditzone mai sus. Vrei sa calculezi ab, daca b este impar ab=ab-1*a, altfel ab=ab/2*ab/2. Din cauza ca b`ul se tot imparte la 2 complexitatea e logaritmica.


Titlul: Răspuns: 519 Modulo
Scris de: Tabara Mihai din Ianuarie 04, 2008, 19:48:59
Pf...care poate sa-mi explice mai clar principiul cu care rezolv problema asta...ca nu inteleg...

si sa nu uiti sa faci % C la fiecare pas pentru ca (A*B) % C = (A%C)*(B%C)  :thumbup:


Titlul: Răspuns: 519 Modulo
Scris de: Stefan Istrate din Ianuarie 04, 2008, 21:07:15
Citat
si sa nu uiti sa faci % C la fiecare pas pentru ca (A*B) % C = (A%C)*(B%C)  :thumbup:

(A*B)%C = ((A%C)*(B%C))%C


Titlul: Răspuns: 519 Modulo
Scris de: Tabara Mihai din Ianuarie 04, 2008, 21:10:02
Citat
si sa nu uiti sa faci % C la fiecare pas pentru ca (A*B) % C = (A%C)*(B%C)  :thumbup:

(A*B)%C = ((A%C)*(B%C))%C
:oops:


Titlul: Răspuns: 519 Modulo
Scris de: Danci Emanuel Sebastian din Ianuarie 11, 2008, 20:54:50
nu stiu ce are...am facut problema in cel mai simplu mod...am ridicat pe A la puterea B si apoi am facut modulo...si iau o pct  :readthis:
pls..help


Titlul: Răspuns: 519 Modulo
Scris de: Florian Marcu din Ianuarie 11, 2008, 21:09:24
Daca mai intai calculezi A^B, si apoi, la sfarsit faci modulo, sa stii ca sigur nu iti va da corect. Gandeste-te la limitele lui A si B, si, apoi, gandeste-te pe ce tip de date intra un numar (cica enorm de mare) care e A^B? Ideea e sa faci modulo la fiecare pas [probabil ca ai rez=rez*A, modifica cu rez=(rez*A)%C ). Oricum, solutia asta nu iti aduce punctajul maxim. Trebuie sa faci in O(log(B)). Vezi ce s-a scris pe topicul asta.  :ok:


Titlul: Răspuns: 519 Modulo
Scris de: Robert Hangu din Februarie 03, 2008, 12:31:06
este necesar lucrul cu numere mari? vad ca poate avea multe cifre rezultatul.


Titlul: Răspuns: 519 Modulo
Scris de: Bondane Cosmin din Februarie 03, 2008, 12:36:28
Se poate fara numere mari.


Titlul: Răspuns: 519 Modulo
Scris de: Robert Hangu din Februarie 03, 2008, 15:39:46
da, m-am prins  :aha: restul este intotdeauna mai mic decat numarul la care se imparte, adica mai mic de 50.000


Titlul: Răspuns: 519 Modulo
Scris de: HoriaC din Februarie 26, 2008, 19:00:16
Imi zice si mie cineva ce e gresit la pb....iau o p. :'(


Titlul: Răspuns: 519 Modulo
Scris de: Adrian Diaconu din Februarie 26, 2008, 19:11:06
Dupa cum iti zice si evaluatorul ai o eroare de compilare. Tu nu iti testezi problemele pe calculatorul tau ?
Dupa declaratia p:longint pune ;


Titlul: Răspuns: 519 Modulo
Scris de: Pripoae Teodor Anton din Februarie 26, 2008, 19:14:03
Tu te astepti ca a la puterea b  sa iti intre in longint? macar pune si tu in64 (parca asta e echivalentul lui long long in pascal) da oricum nu cred ca iti ia macar un test :-'

Cod:
for i:=1 to b do
             p:=p*a;
         k:=p mod c;
tu aici mergi cu i de la 1 la b si faci ceva gen p=a^b nu o sa iti intre in longint pt a si b mai mari de 15 :P uite-te si tu pe topicul asta poate gesesti o rezolvare mai buna :D


Titlul: Răspuns: 519 Modulo
Scris de: HoriaC din Februarie 26, 2008, 19:42:43
Mi-au mers toate testele...aloooo...da..nu vrea...si ce vrei sa-mi zici tu acolo cu longu'?


Titlul: Răspuns: 519 Modulo
Scris de: Pripoae Teodor Anton din Februarie 26, 2008, 19:47:34
ce sa vrea? din cate vad ai eroare de compilare...:P


Titlul: Răspuns: 519 Modulo
Scris de: HoriaC din Februarie 26, 2008, 19:49:35
ce eroare...mie-mi merge
 :-s


Titlul: Răspuns: 519 Modulo
Scris de: Pripoae Teodor Anton din Februarie 26, 2008, 19:52:30
http://infoarena.ro/monitor?user=HoriaClement

eu vad ca pe problema modulo ultimele 3 evaluari au eroare de compilare


Titlul: Răspuns: 519 Modulo
Scris de: Andrei Grigorean din Februarie 26, 2008, 20:12:45
Fii mai coerent in posturi ca nu esti ceausescu la balcon sa ne iei cu alooo. Eventual citeste documentatia, uita-te in evaluator ca sa vezi ce erori ai, compileaza cu altceva, nu cu Borland, si apoi posteaza sa vedem daca e vreo diferenta.


Titlul: Răspuns: 519 Modulo
Scris de: Adrian Diaconu din Februarie 26, 2008, 22:21:29
Si eventual asculta si sfaturile care ti se dau.


Titlul: Răspuns: 519 Modulo
Scris de: Andrici Cezar din Martie 16, 2008, 18:52:12
am neovie de ajutor am citit tot ce sa scris pe acest topic si n u imi iese ... de ce??? nu stiu sa ma ajute si pe mn cineva cca nu mai suport sa iau 0 puncte :readthis: ](*,) :fighting:


Titlul: Răspuns: 519 Modulo
Scris de: Adrian Diaconu din Martie 16, 2008, 19:37:47
Cateva observatii:

* tu aici citesti doar a
Cod:
f>>a,b,c;  
Eventual pune
Cod:
f>>a>>b>>c;  

* in cadrul acestui for tu nu faci nimic pentru ca ai pus ; intre for si instructiune, deci la tine mereu m = a;
Cod:
 for (i=1;i<=b;i++);  
     m=m*a; 

* Complexitatea ta este O(b) care o sa iasa din timp in momentul in care intructiunea din acel for nu va mai fi vida. Incearca sa te uiti peste Problema asta (http://infoarena.ro/problema/lgput) pentru a obtine o complexitate O(log B).


Titlul: Răspuns: 519 Modulo
Scris de: Andrici Cezar din Martie 19, 2008, 16:11:03
mersi amreusit sa iau 100  :winner1:


Titlul: Răspuns: 519 Modulo
Scris de: Anonim din Aprilie 09, 2008, 21:16:17
Eu am facut acelasi algoritm ca la ridicare la putere in timp logaritmic si dupaia am afisat sol%q si iau incorect pe toate :(


Titlul: Răspuns: 519 Modulo
Scris de: Savin Tiberiu din Aprilie 09, 2008, 21:20:33
numarul A^B s-ar putea sa fie putin cam mare, nu crezi ca iti depaseste tipul de date care il folosesti, oricare ar fi acela.


Titlul: Răspuns: 519 Modulo
Scris de: Anonim din Aprilie 09, 2008, 21:45:29
Gata , am rezolvat problema asta era mersi !


Titlul: Răspuns: 519 Modulo
Scris de: cont cu nume gresit sau fals din Mai 07, 2009, 17:23:06
Cod:
#include <stdio.h>

long fct(long a,long A,long b,long c)
{
 if (b<3) return a*a%c;
 else if (b<4) return a*a*a%c;
 else
 {
  a=fct(a,A,b/2,c);
  a=a*a%c;
  if (b%2==1) a=a*A%c;
  return a;
 }
}

int main()
{
 long a,b,c,A;
 freopen("modulo.in","r",stdin);
 freopen("modulo.out","w",stdout);
 scanf("%ld%ld%ld",&a,&b,&c);
 a=a%c;
 A=a;
 if (b>1) a=fct(a,A,b,c);
 printf("%d",a);
 return 0;
}
stie cineva de ce iau doar 40 pct?


Titlul: Răspuns: 519 Modulo
Scris de: Pripoae Teodor Anton din Mai 07, 2009, 18:24:44
Din cate imi aduc aminte, rezultatul trebuia tinut pe long long.


Titlul: Răspuns: 519 Modulo
Scris de: cont cu nume gresit sau fals din Mai 07, 2009, 20:11:41
ms mult
a mers :winner1:


Titlul: Răspuns: 519 Modulo
Scris de: Antoche Ioana Alexandra din Mai 14, 2009, 13:28:31
LA fiecare reapelare de functie am facut modulul...si totusi pe ultimele 2 teste iau WA...
if (p==0) return 1;
if (p%2) return (n%m)*putere((n%m)*(n%m),p/2)%m;
return putere((n%m)*(n%m),p/2)%m;
unde n=a, p=b, m=c
unde gresesc?


Titlul: Răspuns: 519 Modulo
Scris de: Carmen Popescu din Mai 14, 2009, 13:54:58
încearca ca în loc de

ab = (a*a)b/2  pentru b par

să foloseşti

ab = ab/2 * ab/2

evident pe ab/2 îl calculezi o singură dată şi îl memorezi... cel puţin la mine a mers :)


Titlul: Răspuns: 519 Modulo
Scris de: Antoche Ioana Alexandra din Mai 15, 2009, 10:54:00
ok, mersi mult! :)


Titlul: Răspuns: 519 Modulo
Scris de: A Cosmina - vechi din Iulie 23, 2009, 22:06:10
Am creat o functie.

Cod:
long long int put(long int a,long int b,long int c)
    {
    int rez,aux;
    if (b%2!=0) aux=pow(a,b-1)*a;
       else aux=pow(a,b/2)*pow(a,b/2);
    rez=aux%c;
    return rez;
    }

Iau 0 puncte pe rezolvarea mea. Ce as putea optimiza, am citit topicul si am aplicat ceea ce am gasit. What's the problem?  :-s


Titlul: Răspuns: 519 Modulo
Scris de: Mihai Calancea din Iulie 23, 2009, 22:18:02
Am creat o functie.

Cod:
long long int put(long int a,long int b,long int c)
    {
    int rez,aux;
    if (b%2!=0) aux=pow(a,b-1)*a;
       else aux=pow(a,b/2)*pow(a,b/2);
    rez=aux%c;
    return rez;
    }

Iau 0 puncte pe rezolvarea mea. Ce as putea optimiza, am citit topicul si am aplicat ceea ce am gasit. What's the problem?  :-s

Cod:
  if (b%2!=0) aux=pow(a,b-1)*a;
       else aux=pow(a,b/2)*pow(a,b/2);

pow-ul e problema.



Titlul: Răspuns: 519 Modulo
Scris de: A Cosmina - vechi din Iulie 23, 2009, 22:27:37
Sa incerc intr-un for ?  :-k

Edit:

Asa?

Cod:
long long int put(long int a,long int b,long int c)
    {
    int rez,aux=1,i;
    if (b%2!=0)
       {
       for (i=1;i<=b-1;i++)
           aux*=a;
       aux*=a;
       }
    else
         {
         for (i=1;i<=b/2;i++)
             aux*=a;
         for (i=1;i<=b/2;i++)
             aux*=a;
         }
    rez=aux%c;
    return rez;
    }

Sau exista o metoda mai buna?


Titlul: Răspuns: 519 Modulo
Scris de: Mihai Calancea din Iulie 23, 2009, 22:52:40

Nu , mai . B-ul e pana in 1 << 32 pow ( a ,  b/2 ) e urias , degeaba ai facut functia aia daca folosesti pow . Ideea e sa fie recursiva ( desi nu neaparat ) si sa scapi de problema asta. Uita-te pe ridicare la putere in timp logaritmic , ai si surse acolo . Si mai uita-te si pe restul topicului...


Titlul: Răspuns: 519 Modulo
Scris de: A Cosmina - vechi din Iulie 23, 2009, 23:05:02
Multumesc mult pentru ajutor, a iesit !  \:D/


Titlul: Răspuns: 519 Modulo
Scris de: irimias robert din Iulie 21, 2010, 18:47:57
doar ca fapt divers as intreba de ce solutia asta ia 90 pct cu TLE pe testul 9?

Cod:
cv=a;
for (int i=0; (1<<i)<=b; ++i)
{
if (((1<<i)&b)>0)
sol=(sol*cv)%c;
cv=(cv*cv)%c;
            }

sper ca nu ajut prea mult cu codu asta, dar daca da rog un admin sa-l stearga


Titlul: Răspuns: 519 Modulo
Scris de: Paul-Dan Baltescu din Iulie 21, 2010, 20:43:58
Daca b > 2^30, atunci i-ul ar ajunge 31, dar 2^31 iese din int si se face overflow.


Titlul: Răspuns: 519 Modulo
Scris de: irimias robert din Iulie 22, 2010, 12:16:38
a' da chiar  ](*,),  mersi
ar fi trebuit sa pun unsigned int32 ca sa intre


Titlul: Răspuns: 519 Modulo
Scris de: Laurentiu Ion din Martie 01, 2011, 11:21:55
dupa lupte seculare  :weightlift: am reusit sa imi dau seama de ce luam numai 90p, pt ca declaram variabilele "register unsigned long long int"
putin ciudat, dupa ce am sters "register" am luat 100 :winner1:
sunt curios de ce  :-k


Titlul: Răspuns: 519 Modulo
Scris de: Alex Ovidiu Nitu din August 31, 2011, 16:37:58
sursa mea ia 90 de puncte (iau WA pe testul 7 ) ](*,).
imi puteti spune ce e gresit aici:
Cod:
        p=1;
f>>a>>b>>c;
for(i=1;i<=b%c;i++)
p=(p*(a%c))%c;
g<<p%c;


Titlul: Răspuns: 519 Modulo
Scris de: George Marcus din August 31, 2011, 16:56:50
Verifica posturile anterioare.

pt a=4, b=4, c=4 iti afiseaza 1, iar rez e 0...deci e doar o coincidenta ca iei atat de mult, deoarece (a^b)mod(c) nici in o mie de ani nu va fi (a mod c)^(b mod c), adica principiu pe care spui tu ca te bazezi


Titlul: Răspuns: 519 Modulo
Scris de: cont cu nume gresit sau fals din August 31, 2011, 17:01:08
pe sursa asta iei 90?? cred ca glumesti.  :eyebrow:

in primul rand: teorema lui Fermat este ap-1=1(modulo p) (a nedivizibil cu p)
in al doilea rand: teorema este valabila numai pentru p prim

asa ca intrebarea este cum de iei 90.

pe testul 2 3 3, sursa ta da 1, desi raspunsul este 2.

problema se poate rezolva prin ridicare la putere in timp logaritmic (http://infoarena.ro/problema/lgput)
dar avand in vedere dimensiunile mici ale lui c o idee ar fi sa vezi cand apare un ciclu in resturi in O(c) si de aici tot in O(c) sa gasesti raspunsul

l.e.: scuze, nu am vazut postul lui George


Titlul: Răspuns: 519 Modulo
Scris de: FII Florea Toma Eduard din Decembrie 30, 2011, 22:21:51
Am o micuta prooblema:am rezolvat cerinta utilizand ridicarea la putere in timp logaritmic.Cu toate astea iau tle pe testul 9 http://infoarena.ro/job_detail/654803 .Mentionez ca am pus unsigned long long peste tot.Care ar putea fii baiul  ???  ?


Titlul: Răspuns: 519 Modulo
Scris de: Stefan Teodorescu din Ianuarie 22, 2012, 10:07:04
si eu folosesc ridicarea la putere in timp logaritmic (cu optimizare pe biti)  :-' si iau TLE pe testul 9... ceva idei?  :D  ](*,)


Titlul: Răspuns: 519 Modulo
Scris de: Dospra Cristian din Mai 17, 2013, 09:14:41
Cod:
fscanf (f,"%d%d%d",&a,&b,&c);

a=a%c;
b=b%c;
if (a==0 && b==0){
p=0;
}
while (b>0){
if (b%2==1){
p=p%c*a%c;
b--;
}
a=a%c*a%c;
b/=2;
}

fprintf (g,"%d",p);

iau WA pe testele 7 si 10. imi poate spune cineva unde gresesc sau ce uit va rog? :)


Titlul: Răspuns: 519 Modulo
Scris de: Muntea Andrei din Februarie 28, 2014, 08:12:27
Si eu luam WA pe testul 7, la mine era din cauza ca le declarasem variabilele de longint si nu de int64. Cred ca in C++, int 64 este echivalentul la unsigned long long...poti incerca si vezi ce iti da


Titlul: Răspuns: 519 Modulo
Scris de: Andrei Pirjol Comanescu din Septembrie 23, 2017, 11:56:30
Problema destul de easy,dar testul 9 e cam hard core. 90 puncte :harhar: si  :winner2:


Titlul: Răspuns: 519 Modulo
Scris de: ciobanu andrei din Septembrie 23, 2017, 13:01:46
Imi place   :D


Titlul: Răspuns: 519 Modulo
Scris de: Paul Colta din Iunie 15, 2019, 08:17:05
Asta e Exponentiere rapida(in timp logaritmic) Gasiti indicatii pe arhiva educationala. https://www.infoarena.ro/problema/lgput (https://www.infoarena.ro/problema/lgput)