Cod sursa(job #3216719)

Utilizator AlexSerban21Serban Alexandru AlexSerban21 Data 19 martie 2024 12:00:13
Problema Sarpe Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
ifstream fin ("sarpe.in");
ofstream fout ("sarpe.out");
char s[2005];
int i,a[2005],b[2005],v[2005],c[2005],d[2005],e[2005],f[2005];
void copiere (int a[],int b[])
{
    for (int i=1; i<=a[0]; i++)
        a[i]=0;
    a[0]=0;
    for (i=0; i<=b[0]; i++)
        a[i]=b[i];
}
void produs_mic (int a[],int y)
{
    int i=0,t=0;
    for (i=1; i<=a[0]; i++)
    {
        long long k=1ll*a[i]*y+t;
        a[i]=k%10;
        t=k/10;
    }
    while (t!=0)
    {
        a[0]++;
        a[a[0]]=t%10;
        t=t/10;
    }
}
void produs_mare (int c[],int a[],int b[])
{
    int t=0;
    c[0]=a[0]+b[0]-1;
    for (int i=1; i<=a[0]; i++)
    {
        for (int j=1; j<=b[0]; j++)
            c[i+j-1]+=a[i]*b[j];
    }
    for (i=1; i<=c[0]; i++)
    {
        c[i]=c[i]+t;
        t=c[i]/10;
        c[i]=c[i]%10;
    }
    if (t!=0)
        c[++c[0]]=t;
}
void scadere (int a[],int val)
{
    int t=0,i=0;
    for (i=1; t>0||val>0; i++)
    {
        if (a[i]<val+t)
        {
            a[i]=10+a[i]-val-t;
            t=1;
        }
        else
        {
            a[i]=a[i]-val-t;
            t=0;
        }
        val=0;
    }
    while (a[0]>1&&a[a[0]]==0)
        a[0]--;
}
void adunare (int c[],int a[],int b[])
{
    int t=0,i=0;
    for (i=1; i<=a[0]||i<=b[0]; i++)
    {
        c[i]=a[i]+b[i]+t;
        t=c[i]/10;
        c[i]=c[i]%10;
    }
    c[0]=i-1;
    if (t>0)
    {
        c[0]=i;
        c[i]=t;
    }
}
int main()
{
    ///4*n+(n-2)*(n-1)*2
    fin>>s;
    v[0]=strlen (s);
    reverse (s,s+v[0]);
    for (i=1; i<=v[0]; i++)
        v[i]=s[i-1]-'0';
    if (v[0]==v[1]&&v[0]==1)
    {
        fout<<2;
        return 0;
    }
    copiere (a,v);
    copiere (b,v);
    copiere (c,v);
    produs_mic (a,4);
    scadere (b,2);
    scadere (c,1);
    produs_mare (e,b,c);
    produs_mic (e,2);
    adunare (d,a,e);
    for (i=d[0]; i>0; i--)
        fout<<d[i];
    return 0;
}