Cod sursa(job #257005)

Utilizator Sorin_IonutBYSorynyos Sorin_Ionut Data 12 februarie 2009 18:01:26
Problema Ridicare la putere in timp logaritmic Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include<stdio.h>

#define modulo 1999999973
#define IN "lgput.in"
#define OUT "lgput.out"

FILE *fin=fopen(IN,"r");
FILE *fout=fopen(OUT,"w");

long long n,p;

long long putere(long long n, long long p, long long r);

int main()
{
 fscanf(fin,"%lld %lld",&n,&p);
  fclose(fin);
  
 fprintf(fout,"%lld",putere(n,p,modulo));
  fclose(fout);
  
return 0;
}

long long putere(long long n, long long p, long long r)
{
 if(!p)
  return 1; //returnam 1 deoarece orice numar la puterea 0 este 1
  
 if(p%2) //daca exponentul este impar
  return (n*putere(n,p-1,r))%r; //returnam restul impartirii n*n^(p-1) la r
  
 //p este un numar par
 
 long long x;
 x=putere(n,p/2,r); //x primeste restul impartirii n^(p/2) la r
 
 return (x*x)%r; //returnam restul lui x*x la r, adica restul impartirii (n^(p/2))^2 la r
}