Cod sursa(job #116236)

Utilizator pandaemonAndrei Popescu pandaemon Data 18 decembrie 2007 00:23:55
Problema Sarpe Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<fstream.h>
#include<iostream.h>
#include<iomanip.h>
#define special resetiosflags(ios::skipws)
#define LMAX 2000

fstream f("sarpe.in",ios::in),g("sarpe.out",ios::out);
char s;
int n1=1,n2,n3,v1[LMAX],v2[LMAX],v3[LMAX],fin[LMAX],i,j;


void adun()
{for(i=1;i<=n3;i++) fin[i]+=v3[i];
 int max; if(n3>n2) max=n3;
	  else max=n2;

 for(j=1;j<=max;j++)
 if(fin[j]>9)
 {fin[j]=fin[j]%10;
 fin[j+1]+=1;}     if(fin[j]>0) max++;

 for(i=max;i>=1;i--) g<<fin[i];}

void inm_M()
{int k=-1,var;
for(i=1;i<=n1;i++) {k++;
for(j=1;j<=n2;j++) fin[j+k]+=v1[i]*v2[j];}

for(i=1;i<=n2+k;i++)
if(fin[i]>9) {fin[i+1]+=fin[i]/10; fin[i]=fin[i]%10;}
n2=n2+k;
while(fin[n2+1]!=0)
{n2++; fin[n2+1]+=fin[n2]/10; fin[n2]=fin[n2]%10;} }

void invert()
{int aux;
for(i=1;i<=n1/2;i++)
{aux=v1[n1-i+1]; v1[n1-i+1]=v1[i]; v1[i]=aux;}
for(i=1;i<=n1;i++) v3[i]=v2[i]=v1[i]; }


void scad_m(int x,int &end,int *v)
{v[1]-=x; i=1;
 while(v[i]<0) {v[i]+=10; i++; v[i]-=1;}
 if(v[end]==0) end--;
}


void inm_m(int x,int &end,int *v)
{int var,ad=0;
for(i=1;i<=end;i++)
{var=v[i]*x+ad; v[i]=var%10; ad=var/10;}
if(ad!=0) {end++; v[end]=ad;} }

main()
{

f>>special>>s;
while(s>='0' && s<='9') {v1[n1++]=s-48; f>>special>>s;}  n1--;

if(n1==1 && v1[1]==1) g<<1;
else{
 n2=n3=n1;  invert();

 scad_m(1,n1,v1); scad_m(2,n2,v2);
 inm_M(); inm_m(4,n3,v3); inm_m(2,n2,fin); adun();

 }
 }


 //4n+2*(n-1)*(n-2),n>1