Cod sursa(job #1461673)

Utilizator alex.craciunCraciun Alexandru alex.craciun Data 16 iulie 2015 11:12:24
Problema Ridicare la putere in timp logaritmic Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
/**
 Ridicare la putere in timp logaritmic:

Metoda 1: plecam de la numarul de ridicat shi, atunci cind puterea la care trebuie sa-l
  ridicam este para, il putem reduce la ridicarea la patrat a valorii obtzinute prin
  injumatatzire, pe cind atunci knd este impara, il putem reduce la inmulzitrea dintre el
  shi puterea la care trebuie sa-l ridicam minus 1.

  Ashadar luam mai intii puterea shi vedem care este succesiunea de operatzii care trebuie facute
(le memoram intr-un vector) shi apoi, pe baza lor, refacem invers calculele
*/
#include <fstream>
using namespace std;

int pl(int n,int p)
{
    char op[100],nop=0;
    long long rez=1;
    while(p)
    {
        if(p%2==0)
        {
            op[++nop]=0;
            p/=2;
        }
        else
        {
            op[++nop]=1;
            p--;
        }
    }
    while(nop)
    {
        if(op[nop])
             rez=(rez%1999999973*(n%1999999973))%1999999973;
        else
            rez=(rez%1999999973*(rez%1999999973))%1999999973;
        nop--;
    }
    return rez;
}

int main()
{
    int n,p;
    ifstream fin("lgput.in");
    fin>>n>>p;
    ofstream fout("lgput.out");
    fout<<pl(n,p);
    return 0;
}