Cod sursa(job #206034)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 4 septembrie 2008 12:06:47
Problema Sarpe Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <stdio.h>
#include <string.h>
  
#define BAZA 10000   
#define N_MAX 2000
  
int N;
char s[N_MAX];
int REZ[N_MAX];   
int REZ1[N_MAX];   
int REZ2[N_MAX];   
int REZ3[N_MAX];   
int REZ4[N_MAX];   
int REZ5[N_MAX];   
int REZ6[N_MAX];   
  
  
void inmultire_patru(int A[])   
{   
int i,t=0;   
  
for (i=1;i<=A[0] || t;++i,t/=BAZA)   
      A[i]=(t+=A[i]*4)%BAZA;   
  
A[0]=i-1;   
}   
  
void inmultire_doi(int A[])   
{   
int i,t=0;   
  
for (i=1;i<=A[0] || t;++i,t/=BAZA)   
      A[i]=(t+=A[i]*2)%BAZA;   
  
A[0]=i-1;   
}   
  
void adunare(int A[],int B[],int C[])   
{   
int i,t=0;   
for (i=1;i<=A[0] || i<=B[0] || t;++i,t/=BAZA)   
     C[i]=(t+=A[i]+B[i])%BAZA;   
  
C[0]=i-1;   
}   
  
void inmultire(int A[],int B[],int C[])   
{   
int i,t=0;   
for (i=1;i<=A[0] || i<=B[0] || t;++i,t/=BAZA)   
     C[i]=(t+=A[i]*B[i])%BAZA;   
  
C[0]=i-1;   
}   
  
void sub(int A[],int B[])   
{   
int i,t=0;   
for (i=1;i<=A[0];++i)   
    A[i]+=(t=(A[i]-=B[i]+t)<0)*BAZA;   
for (;A[0]>1 && !A[A[0]];--A[0]);   
}   
  
void AtribValue(int A[], unsigned long X)   
{   
A[0]=0;   
while (X)   
      {   
      ++A[0];   
      A[A[0]]=X%BAZA;   
      X/=BAZA;   
  }   
}   
  
  
int main()   
{   
int i,l,j;
freopen("sarpe.in","rt",stdin);   
scanf("%s",s);
    l=strlen(s);
    for (i=1;i<=l;i+=4)
    {
	++REZ[0];
	++REZ1[0];
	++REZ2[0];
	for (j=3;j>=0;--j)
	    if (l-i-j>=0)
		{
		REZ[REZ[0]]=REZ[REZ[0]]*10+s[l-i-j]-'0';
		REZ1[REZ1[0]]=REZ1[REZ1[0]]*10+s[l-i-j]-'0';
		REZ2[REZ2[0]]=REZ2[REZ2[0]]*10+s[l-i-j]-'0';
		}
    }
inmultire_patru(REZ);
REZ3[1]=1;
REZ4[1]=2;
sub(REZ1,REZ3);
sub(REZ2,REZ4);
inmultire(REZ1,REZ2,REZ5);
inmultire_doi(REZ5);
adunare(REZ,REZ5,REZ6);
freopen("sarpe.out","wt",stdout);
printf("%d", REZ6[REZ6[0]]);
for (i=REZ6[0]-1;i;--i)
     printf("%04d", REZ6[i]);
return 0;
}