Cod sursa(job #1110454)

Utilizator DarkyAngelDarky Angel DarkyAngel Data 18 februarie 2014 08:35:30
Problema Ridicare la putere in timp logaritmic Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <iostream>
#include <ctime>
#include <cstdlib>
#define MODN 1999999973

using namespace std;

ifstream f("lgput.in");
ofstream g("lgput.out");

long long pow(long long a, long long b)
{
    long long ret = 1;
    while(b--)
    {
        ret = (ret * a) % MODN;
    }
    return ret;
}

long long expf(long long a, long long n)
{
    if(n < 0)
        return expf(1/a, -n);
    else if(n == 0)
        return 1;
    else if(n == 1)
        return a;
    else if(n%2)
        return (a * expf((a*a)%MODN, (n-1)/2)) % MODN;
    else
        return expf((a*a)%MODN, n/2) % MODN;
}

void brute(int t)
{
    srand(time(NULL));
    long long res1, res2, x1, x2;
    float c1, c2;
    c1 = t;
    c2 = 0;

    while(t--)
    {
        x1 = rand() % MODN-1;
        x2 = rand() % MODN-1;
        res1 = pow(x1, x2);
        res2 = expf(x1, x2);
        cout << res1 << ":" << res2 << '\n';
        if(res1 == res2)
            ++c2;
    }
    cout << c2/c1 * 100 << "%";
}

int main ()
{
    long long x, y;
    f >> x >> y;
    //brute(5);
    g << expf(x, y);
}