Cod sursa(job #157938)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 13 martie 2008 13:06:35
Problema Ridicare la putere in timp logaritmic Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.58 kb
//Ridicare ala putere in timp logaritmic
#include <cstdio>
const int p=1999999973;
int x,n,i,j,r[40],p2max;//r[k]=restul impartirii lui x^2^k la p
long long a,rest;
int main(){
    freopen("lgput.in","r",stdin);
    freopen("lgput.out","w",stdout);
    scanf("%d %d",&x,&n);
    p2max=0;while ((1<<p2max)<=n) p2max++;
    p2max--;r[0]=x%p;
    for (i=1;i<=p2max;i++) {a=r[i-1];
                            a=(a*a)%p;
                            r[i]=a;}
    rest=1;
    for (i=0;i<=p2max;i++)
     if ((1<<i)&n) rest=(rest*r[i])%p;
    printf("%d",rest);
}