Cod sursa(job #1601662)

Utilizator iulian_f2kGuraliuc Iulian iulian_f2k Data 16 februarie 2016 09:49:14
Problema Ridicare la putere in timp logaritmic Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include <iostream>             //PUTERE < POW < LGPOW -> numere mici
#include <cstdio>               //PUTERE < LGPOW < pow -> numere mari ( pow nu face %Mod)
#include <ctime>
#include <cmath>
#define Mod 1999999973
using namespace std;
long long b,pw;

//long long lgpow(long long b,long long pw);
//void testareTimpiEx();
long long Putere(long long b, long long pw);

int main()
{
    freopen("lgput.in","rt",stdin);
    freopen("lgput.out","wt",stdout);
    scanf("%ld%ld", &b, &pw);
    cout<<Putere(b, pw)<<'\n';
    //cout<<lgpow(b, pw)<<'\n';
}
long long Putere(long long b, long long pw)
{
    long long rez = 1;
    while(pw>0)
    {
        if(pw & 1) //putere impara
        {
            rez = (rez * b) % Mod;
            pw--;      //puterea redevine para
        }
        b = (b * b) % Mod;
        pw = pw >> 1;   //puterea se injumatateste
    }
    return rez;
}
/*
void testareTimpiEx()
{
    int k,k1;
    clock_t t ;
    int test[]= {200000,500000,1500000,2000000};
    for(int j=0; j<4; j++)
    {
        printf("nr=%d\n",test[j]);

        t= clock();
        for(int i=1; i<=test[j]; i++)         //
        {
            b=2;
            pw=30;
            k1=pow(b,pw);
        }
        t = clock() - t;
        printf("Time used: %lf seconds for pow \n",((double)t)/CLOCKS_PER_SEC);
        t = clock();
        for(int i=1; i<=test[j] ; i++)        //
        {
            b=2;
            pw=30;
            k=lgpow(b,pw);
        }
        t = clock() -t;
        printf("Time used: %lf seconds for lgpow\n",((double)t)/CLOCKS_PER_SEC);
        t= clock();
        for(int i=1; i<=test[j]; i++)         //
        {
            b=2;
            pw=30;
            k1=Putere(b,pw);
        }
        t = clock() - t;
        printf("Time used: %lf seconds for putere \n",((double)t)/CLOCKS_PER_SEC);
    }
}

long long lgpow(long long b,long long pw)
{
    if(pw == 1)
        return b;
    long long p = lgpow(b, pw/2) % Mod;
    return (((p * p) % Mod) * (pw % 2 ? b : 1)) % Mod;
}*/