Cod sursa(job #2700379)

Utilizator pielevladutPiele Vladut Stefan pielevladut Data 27 ianuarie 2021 16:00:50
Problema Ridicare la putere in timp logaritmic Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <bits/stdc++.h>

#define MOD 1999999973

#define int long long

using namespace std;

ifstream fin("lgput.in");
ofstream fout("lgput.out");

int n;
int v[300300];
int factorial[300300];

void precalc()
{
    factorial[0] = 1;
    for(int i = 1; i <= 300000; i ++)
    {
        factorial[i] = factorial[i-1] * i;
        factorial[i] %= MOD;
    }
}

int lgput(int base, int exp)
{
    int ans = 1, aux = base;
    for(int i = 1; i <= exp; i *= 2)
    {
        if(i & exp)
        {
            ans = ans * aux;
            ans %= MOD;
        }
        aux = aux * aux;
        aux %= MOD;
    }
    return ans;
}

int combinari(int nn, int kk)
{
    if(nn <= kk)
    {
        int N = nn + kk - 1;
        int K = nn;
        return (((factorial[N] * lgput(factorial[K], MOD - 2)) % MOD) * lgput(factorial[N-K], MOD - 2)) % MOD;
    }
    else
        return (((factorial[nn] * lgput(factorial[kk], MOD - 2)) % MOD) * lgput(factorial[nn-kk], MOD - 2)) % MOD;
}

int32_t main()
{
    bool ok = false;
    int m;
    fin >> n >> m;
    fout << lgput(n,m);
    return 0;
    /*
    for(int i = 1; i <= n; i ++)
    {
        cin >> v[i];
        if(v[i] < 0)
            ok = true;
    }
    if(ok == true)
        return 0;
    precalc();
    int i = 1, first = 0, last = 0, ans = 1;
    while(i <= n)
    {
        while(v[i] > 0 && i <= n)
            i++;
        if(i > n)
            break;
        int poz = i;
        first = v[i-1];
        while(v[i] == 0)
            i++;
        last = v[i];
        int poz2 = i;
        ans *= combinari(last - first + 1, poz2 - poz);
        ans %= MOD;
    }
    cout << ans << '\n';
    */
}