Cod sursa(job #1290458)

Utilizator catalincraciunCraciun Catalin catalincraciun Data 11 decembrie 2014 11:48:34
Problema Ridicare la putere in timp logaritmic Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <iostream>
#include <fstream>

using namespace std;

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

unsigned long long a,b,z;
unsigned long long rezultat = 1;

inline int maxim (int a, int b) { return (a>b)?a:b; };
int pow(int x, int n,int modul)
{
    int tip;
    if(n==0) return 1;
    if(n%2==1) return (x*pow(x,n-1,modul))%modul;
    tip=pow(x,n/2,modul)%modul;
    return tip*tip%modul;
}

int main() {

    f>>a>>b>>z;/*
    int limita = 1000;
    limita = maxim(limita, a/2);
    for (int i=2;i<=1000;i++)
        if (a % i == 0) {
            while (a % i == 0) {
                a /= i;
                rezultat = rezultat * pow(i,b,z);
            }
        }

    rezultat = rezultat * pow(a, b, z);
    g<<rezultat<<'\n';
*/

    long long result = 1;
    long long N, P, MOD; f>>N>>P>>MOD;
    long long step = N;
    for (long long i = 1; i <= P; i <<= 1)
    {
        if (P & i) result *= step;
        step *= step;

        step %= MOD, result %= MOD;
    }

    g << result;

    f.close(); g.close();
    return 0;
}