Cod sursa(job #216774)

Utilizator taloibogdanTaloi Bogdan Cristian taloibogdan Data 25 octombrie 2008 20:04:13
Problema Sarpe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include<stdio.h>
#include<string.h>
char ns[1005];
long n,i,lll,lb,j,ll,q,x,aaa;
/*m*/int a[10010],c[10010],b[10010],aa[10010],bb[10010];
void inmult(/*m*/int a[],/*m*/int x,/*m*/int lr)
{long 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(/*m*/int a[],/*m*/int n,/*m*/int bb[],/*m*/int m)
{long t=0,i;
 if(n>m)
   {lb=n;
   for(i=n;i;--i)
      {
       b[i]=a[i]+t;
       t=0;
       if(m-(n-i)>0)b[i]+=bb[m-(n-i)];
       if(b[i]>=10)t=b[i]/10;
       if(i>1)b[i]%=10;
      }}
    else
   {lb=m;
   for(i=m;i;--i)
      {
       b[i]=bb[i]+t;
       t=0;
       if(n-(m-i)>0)b[i]+=a[n-(m-i)];
       if(b[i]>=10)t=b[i]/10;
       if(i>1)b[i]%=10;
      }}
 if(t){b[0]=t;++lb;for(i=lb;i;--i)b[i]=b[i-1];}
}

void inmult2(/*m*/int l1,/*m*/int l2,/*m*/int a1[],/*m*/int a2[])
{long t;
 memset(b,0,sizeof(b));
 lb=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(b,lb,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]=((/*m*/int)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(c,a,sizeof(a));
 x=n;
 while(!a[x]){a[x]=9;--x;}
 a[x]-=1;
 inmult2(n,n,a,c);
 inmult(b,2,lb);
 adunare(bb,q,b,lll);
 for(i=1;i<=lb;++i)printf("%u",b[i]);
 return 0;
}