Cod sursa(job #918468)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 18 martie 2013 21:44:20
Problema Sarpe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<fstream>
#include<cstring>
#define N 10100
using namespace std;
ifstream f("sarpe.in");
ofstream g("sarpe.out");
int i,n,a[N],b[N],c[N],d[N],e[N];
char s[1011];
void scade1(int x[],int n)
{int t,i;
t=-n;
for(i=1;t;++i)
{x[i]+=t;
t=0;
while(x[i]<0)
{--t;x[i]+=10;}
}
while(x[x[0]]==0&&x[0])
    --x[0];
}
void inmultire2(int a[],int b[],int c[])
{int i,t=0,j,n=a[0]-1+b[0];
for(i=1;i<=a[0];++i)
    for(j=1;j<=b[0];++j)
        c[i+j-1]+=a[i]*b[j];
for(i=1;i<=n||t;++i)
{c[i]+=t;
t=c[i]/10;
c[i]%=10;
}
c[0]=i-1;
}
void inmultire(int x[],int n)
{int i,y,t=0;
for(i=1;i<=x[0]||t;++i)
{y=x[i]*n+t;
x[i]=y%10;
t=y/10;
}
x[0]=i-1;
}
void aduna(int x[],int y[],int z[])
{int y1,t=0,i;
for(i=1;i<=x[0]||i<=y[0]||t;++i)
{y1=x[i]+y[i]+t;
t=y1/10;
z[i]=y1%10;
}
z[0]=i-1;
}
void copiere(int a[],int b[])
{int i;
for(i=1;i<=b[0]||i<=a[0];++i)
    a[i]=b[i];
a[0]=b[0];
}
int main()
{f>>s;
n=strlen(s);
for(i=1;i<=n;++i)
    a[n-i+1]=s[i-1]-'0';
a[0]=n;
copiere(b,a);
inmultire(b,4);
copiere(c,a);
copiere(d,a);
scade1(c,1);
scade1(d,2);
inmultire2(c,d,e);
inmultire(e,2);
aduna(e,b,e);
if(a[0]==1&&a[1]==1)
{g<<2<<'\n';
return 0;
}
for(i=e[0];i;--i)
    g<<e[i];
g<<'\n';
return 0;
}