Cod sursa(job #2388796)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 26 martie 2019 14:24:16
Problema Calcul Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.89 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;
    long long n,mod;
    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]= (solve[i+1] * (1 + calcul[i+1]))%mod;
            solve[i]= (solve[i]*n)%mod;
            solve[i]=(solve[i]+n)%mod;
        }
        else { /// b par
            solve[i] = (solve[i+1] * (1 + calcul[i+1]))%mod;
        }
    }
    int c2=solve[1],cf=0;
    if (c2==0)
        cf=1;
    while (c2){
        cf++;
        c2/=10;
    }
    for (i=cf+1;i<=c;i++)
        fprintf (fout,"0");
    fprintf (fout,"%lld",solve [1]);
    return 0;
}