Cod sursa(job #2945561)

Utilizator Codrut198Codrut Dinca Codrut198 Data 23 noiembrie 2022 21:44:10
Problema Ridicare la putere in timp logaritmic Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("lgput.in");
ofstream g("lgput.out");int i;
    long long n,p,pr=1999999973,x[100],k=0,y;
int main()
{

    f>>n>>p;
    y=n%pr;x[0]=1;x[1]=y*y%pr;
    for(i=2;pow(2,i)<p;i++)
        x[i]=x[i-1]*x[i-1]%pr;p--;
    while(k!=p)
    {
        cout<<k<<" "<<i<<endl;
        if(pow(2,i)>p-k)
            i--;
        else
        {
            if(i==0)
            {
                y = n*y;
            y = y%pr;
            k+=pow(2,i);
            }
            else{
            y = x[i]*y;
            y = y%pr;
            k+=pow(2,i);}


        }
    }
    /*while(p>32)
    {
        x[0] = x[5]*x[0];
        x[0] = x[0]%pr;
        p-=32;
    }
    while(p>16)
    {
        x[0] = x[4]*x[0];
        x[0] = x[0]%pr;
        p-=16;
    }
    while(p>8)
    {
        x[0] = x[3]*x[0];
        x[0] = x[0]%pr;
        p-=8;
    }
    while(p>4)
    {
        x[0] = x[2]*x[0];
        x[0] = x[0]%pr;
        p-=4;
    }
    while(p>2)
    {
        x[0] = x[1]*x[0];
        x[0] = x[0]%pr;
        p-=2;
    }
    while(p>1)
    {
        x[0] = n*x[0];
        x[0] = x[0]%pr;
        p--;
    }*/
    cout<<k<<" "<<i<<" "<<pow(2,0);
    g<<y;
}
/*x[1]=(x[0]*x[0])%pr;
    x[2]=(x[1]*x[1])%pr;
    x[3]=(x[2]*x[2])%pr;
    x[4]=(x[3]*x[3])%pr;
    x[5]=(x[4]*x[4])%pr;*/