Cod sursa(job #2388653)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 26 martie 2019 11:54:10
Problema Calcul Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <cstdio>
#include <cstring>
#include <iostream>
#define DEBUG 0
#define DIM 200010
using namespace std;
int b[DIM];
long long calcul[DIM],solve[DIM];
char a[DIM], s[DIM];
void updcf (int &elem,int cf){
    b[elem+1]=cf%2;
    cf/=2;
    b[elem+2]=cf%2;
    cf/=2;
    b[elem+3]=cf%2;
    cf/=2;
    b[elem+4]=cf%2;
    cf/=2;
    elem+=4;
}
int main()
{
    FILE *fin=fopen ("calcul.in","r");
    FILE *fout=fopen ("calcul.out","w");
    int x,elem,i,c,n,mod;
    int soll=0,pa=1,bb,aa;
    if (DEBUG){
        fscanf (fin,"%d%d%d",&aa,&bb,&c);
        mod=1;
        for (i=1;i<=c;i++)
            mod=(mod*10);
        aa%=mod;
        for (i=1;i<=bb;i++){
            pa=((long long)pa*aa)%mod;
            soll=(soll+pa)%mod;
        }
        fprintf (fout,"%d",soll);
        return 0;
    }
    fgets (a,DIM,fin);
    x=strlen(a)-2;
    fgets (s,DIM,fin);
    elem=0;
    for (i=strlen(s)-2;i>=0;i--){
        if ('0'<=s[i] && s[i]<='9')
            updcf(elem,s[i]-'0');
        else updcf(elem,10+s[i]-'A');
    }
    fscanf (fin,"%d",&c);
    n=0;
    mod=1;
    for (i=1;i<=c;i++)
        mod=(mod*10);
    for (i=max(0,x-c+1);i<=x;i++){
        n=n*10+(a[i]-'0');
    }
    /// n ^ 1 + ... + n ^ b
    while (b[elem]==0)
        elem--;
    for (i=elem;i;i--){
        if (i==elem)
            calcul[i]=n; /// n ^ (2^0)
        else{
            calcul[i]= (calcul[i+1] * calcul[i+1])%mod ;
            if (b[i]==1)
                calcul[i]=( calcul[i]* n)%mod;
        }
    }
    /// calcul[i] = n ^ [ nr format din b cu i .. elem ]
    /// b[elem] = cel mai semnificativ
    /// calcul vector solve[i], solutia  pt bitii i,elem
    for (i=elem;i;i--){
        if (b[i]==1){ /// b impar
            solve[i] =( n +  ( n * (solve[i+1] * (1 + calcul[i+1]))%mod )%mod)%mod;
        }
        else { /// b par
            solve[i] = (solve[i+1] * (1 + calcul[i+1]))%mod;
        }
    }
    int c2=solve[1],cf=0;
    while (c2){
        cf++;
        c2/=10;
    }
    for (i=cf+1;i<=c;i++)
        fprintf (fout,"0");
    fprintf (fout,"%lld",solve [1]);
    return 0;
}