Cod sursa(job #216763)

Utilizator taloibogdanTaloi Bogdan Cristian taloibogdan Data 25 octombrie 2008 19:15:42
Problema Sarpe Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include<stdio.h>
#include<string.h>
char ns[1005];
unsigned char n,i,lll,lc,j,ll,q,x,aaa;
unsigned char a[1000005],b[1000005],c[1000005],aa[1000005],bb[1000005],a1[1000005];
void inmult(unsigned char a[],unsigned char x,unsigned char lr)
{unsigned char i,t=0;
 for(i=lr;i;--i)
    {
     b[i]=a[i]*x+t;
     t=b[i]/10;
     b[i]%=10;
    }
 while(t){b[0]=t%10;t/=10;
 ++lr;
 for(i=lr;i;--i)b[i]=b[i-1];}
 lll=lr;
}
void adunare(unsigned char a[],unsigned char n,unsigned char b[],unsigned char m)
{unsigned char t=0,i;
 if(n>m)
   {lc=n;
   for(i=n;i;--i)
      {
       c[i]=a[i]+t;
       t=0;
       if(m-(n-i)>0)c[i]+=b[m-(n-i)];
       if(c[i]>=10)t=c[i]/10;
       if(i>1)c[i]%=10;
      }}
    else
   {lc=m;
   for(i=m;i;--i)
      {
       c[i]=b[i]+t;
       t=0;
       if(n-(m-i)>0)c[i]+=a[n-(m-i)];
       if(c[i]>=10)t=c[i]/10;
       if(i>1)c[i]%=10;
      }}
 if(t){c[0]=t;++lc;for(i=lc;i;--i)c[i]=c[i-1];}
}

void inmult2(unsigned char l1,unsigned char l2,unsigned char a1[],unsigned char a2[])
{unsigned char t;
 memset(c,0,sizeof(c));
 lc=0;
 for(j=1;j<=l2;++j)
 {
  ll=l1;
  t=0;
  for(i=l1;i;--i)
     {
      aa[i]=a1[i]*a2[j]+t;
      t=aa[i]/10;
      aa[i]%=10;
     }
  while(t){aa[0]=t%10;t/=10;
  ++ll;
  for(i=ll;i;--i)aa[i]=aa[i-1];}
  for(i=ll+1;i<=ll+j-1;++i)aa[i]=0;
  ll+=l2-j;
  adunare(c,lc,aa,ll);
 }
}
int main()
{
 freopen("sarpe.in","r",stdin);
 freopen("sarpe.out","w",stdout);
 gets(ns);
 n=strlen(ns);
 for(i=1;i<=n;++i)a[i]=((unsigned char)ns[i-1])-48;
 if(n==1&&a[1]==1){printf("2\n");return 0;}
 inmult(a,4,n);
 memcpy(bb,b,sizeof(b));
 q=lll;
 x=n;
 while(!a[x]){a[x]=9;--x;}
 a[x]-=1;
 memcpy(a1,a,sizeof(a));
 x=n;
 while(!a[x]){a[x]=9;--x;}
 a[x]-=1;
 inmult2(n,n,a,a1);
 inmult(c,2,lc);
 adunare(bb,q,b,lll);
 for(i=1;i<=lc;++i)printf("%u",c[i]);
 return 0;
}