infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva Infoarena Monthly => Subiect creat de: Mihai-Alexandru Dusmanu din Noiembrie 16, 2012, 10:26:06



Titlul: 037 ClassicTask
Scris de: Mihai-Alexandru Dusmanu din Noiembrie 16, 2012, 10:26:06
Aici puteţi discuta despre problema ClassicTask (http://infoarena.ro/problema/classictask).


Titlul: Răspuns: 037 ClassicTask
Scris de: Albu Dumitru Cristian din Noiembrie 25, 2012, 09:56:13
Va rog explicati-mi ce gresesc si de ce imi merg doar primele 5 teste.

#include <stdio.h>
long long int N, P, M;
long long int res   = 1;
long long int n     = 0;

int main(void)
{
    freopen("classictask.in", "r", stdin) ;
    freopen("classictask.out", "w", stdout)   ;
    scanf("%lld %lld %lld", &N, &P, &M);
    n = N;
    while (P != 0)
    {
        if ((P & 1) != 0)   // numarul este impar ?
            res = (res * n) % M;
        n = (n * n) % M;
        P >>= 1;
    }
    printf("%lld\n", res);
    return 0;
}


Titlul: Răspuns: 037 ClassicTask
Scris de: George Marcus din Noiembrie 25, 2012, 12:48:51
Overflow. Chiar aici era dificultatea problemei. Da-i cel mai mare C posibil si o sa vezi ca iti va da numere negative cateodata.


Titlul: Răspuns: 037 ClassicTask
Scris de: Johnny Depp din Iunie 25, 2013, 13:08:38
am si eu aceeasi problema, adica iau ok doar pe primele 5 teste. Cum as putea scapa de overflow?


Titlul: Răspuns: 037 ClassicTask
Scris de: FMI Trifan Mircea Mihai din Iunie 25, 2013, 14:24:26
Folosesti numere mari.  :)


Titlul: Răspuns: 037 ClassicTask
Scris de: Mihai Calancea din Iunie 25, 2013, 16:25:38
Ideea era sa nu faci asta :). Se poate mult mai scurt.