Cod sursa(job #1059979)

Utilizator impulseBagu Alexandru impulse Data 17 decembrie 2013 13:01:17
Problema Ridicare la putere in timp logaritmic Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.73 kb
//
//  main.c
//  lgput
//
//  Created by Alexandru Bâgu on 12/17/13.
//  Copyright (c) 2013 Alexandru Bâgu. All rights reserved.
//

#include <stdio.h>

typedef unsigned int uint;
typedef unsigned long long ulong;

ulong lgpow(ulong n, int p, uint mod)
{
    if(p < 0) return lgpow(n, -p, mod);
    if(p == 0) return 1;
    if(p == 1) return n;
    if(p&1) return (n * lgpow((n*n) % mod, (p^1)>>1, mod)) % mod;
    else return lgpow((n*n) % mod, p>>1, mod) % mod;
}

int main(int argc, const char *argv[])
{
    freopen("lgput.in", "r", stdin);
    freopen("lgput.out", "w", stdout);
    
    const uint mod = 1999999973;
    ulong n;
    int p;
    scanf("%lld %d", &n, &p);
    printf("%lld\n", lgpow(n, p, mod) % mod);
    
    return 0;
}