Mai intai trebuie sa te autentifici.

Cod sursa(job #2329932)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 27 ianuarie 2019 17:56:52
Problema Ridicare la putere in timp logaritmic Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.63 kb
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

typedef long long ll;
typedef long double ld;


const int SIZE = 1 << 10;

int pointer = SIZE;
char buffer[SIZE];

char Advance()
{
    if (pointer == SIZE)
    {
        fread (buffer, 1, SIZE, stdin);
        pointer = 0;
    }
    return buffer[pointer++];
}

int Read()
{
    int answer = 0;
    char ch = Advance();
    while (!isdigit (ch))
        ch = Advance();
    while (isdigit (ch))
    {
        answer = answer * 10 + ch - '0';
        ch = Advance();
    }
    return answer;
}

struct UF
{
        vector<int>t;
        void build(int n)
        {
                t.resize(n+1);
                for(int i=1;i<=n;i++)
                {
                        t[i]=i;
                }
        }
        int dad(int a)
        {
                if(a==t[a])
                {
                        return a;
                }
                else
                {
                        t[a]=dad(t[a]);
                        return t[a];
                }
        }
        void uni(int a,int b)
        {
                a=dad(a);
                b=dad(b);
                if(a!=b)
                {
                        t[a]=b;
                }
        }
        bool same(int a,int b)
        {
                return (dad(a)==dad(b));
        }
};

struct RMQ_MAX
{
        vector<vector<int>>ret;
        vector<int>mylog;
        void build(int n,int a[])
        {
                ret.resize(n+1);
                mylog.resize(n+1);
                for(int i=2;i<=n;i++)
                {
                        mylog[i]=1+mylog[i/2];
                }
                for(int i=1;i<=n;i++)
                {
                        ret[i].resize(mylog[n]+1,-(1<<30));
                        ret[i][0]=a[i];
                }
                for(int k=1;(1<<k)<=n;k++)
                {
                        for(int i=1;i+(1<<k)-1<=n;i++)
                        {
                                ret[i][k]=max(ret[i][k-1],ret[i+(1<<(k-1))][k-1]);
                        }
                }
        }
        int ask(int l,int r)
        {
                int k=mylog[r-l+1];
                return max(ret[l][k],ret[r-(1<<k)+1][k]);
        }
};

struct RMQ_MIN
{
        vector<vector<int>>ret;
        vector<int>mylog;
        void build(int n,int a[])
        {
                ret.resize(n+1);
                mylog.resize(n+1);
                for(int i=2;i<=n;i++)
                {
                        mylog[i]=1+mylog[i/2];
                }
                for(int i=1;i<=n;i++)
                {
                        ret[i].resize(mylog[n]+1,(1<<30));
                        ret[i][0]=a[i];
                }
                for(int k=1;(1<<k)<=n;k++)
                {
                        for(int i=1;i+(1<<k)-1<=n;i++)
                        {
                                ret[i][k]=min(ret[i][k-1],ret[i+(1<<(k-1))][k-1]);
                        }
                }
        }
        int ask(int l,int r)
        {
                int k=mylog[r-l+1];
                return min(ret[l][k],ret[r-(1<<k)+1][k]);
        }
};

vector<vector<int>>royfloyd(vector<vector<int>>a)
{
        int n=a.size();
        for(int k=0;k<n;k++)
        {
                for(int i=0;i<n;i++)
                {
                        for(int j=0;j<n;j++)
                        {
                                a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
                        }
                }
        }
        return a;
}

const int MOD=1999999973;

int add(int a,int b)
{
        a+=b;
        if(a>=MOD)
        {
                a-=MOD;
        }
        if(a<0)
        {
                a+=MOD;
        }
        return a;
}

int mul(int a,int b)
{
        return a*(long long)b%MOD;
}

int expow(int a,int b)
{
        int res=1;
        while(b)
        {
                if(b&1)
                {
                        res=mul(res,a);
                }
                a=mul(a,a);
                b>>=1;
        }
        return res;
}

#define read(FILENAME) freopen((FILENAME+".in").c_str(),"r",stdin)
#define write(FILENAME) freopen((FILENAME+".out").c_str(),"w",stdout)
#define files(FILENAME) read(FILENAME),write(FILENAME)

const string FILENAME="royfloyd";


int main()
{
        //ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
        files(FILENAME);
        int a=Read(),b=Read();
        cout<<expow(a,b)<<"\n";
        return 0;
}
/**

**/