Cod sursa(job #1799658)

Utilizator iulianrotaruRotaru Gheorghe-Iulian iulianrotaru Data 6 noiembrie 2016 16:42:48
Problema Sarpe Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("sarpe.in");
ofstream g("sarpe.out");
int N[1<<14],Np[1<<20];
char aux[1<<10];
void Inm(int x)
{
    for(int i=1;i<=Np[0];++i)
    {
        Np[i]*=x;
        if(Np[i]>=10)
        {
            Np[i+1]+=Np[i]/10;
            Np[i]%=10;
            Np[0]=max(Np[0],i+1);
        }
    }
}
void Sq()
{
    for(int i=1;i<=N[0];++i)
        for(int j=1;j<=N[0];++j)
        {
            Np[i+j-1]+=N[i]*N[j];
            if(Np[i+j-1]>=10)
            {
                Np[i+j]+=Np[i+j-1]/10;
                Np[i+j-1]%=10;
            }
        }
    Np[0]=2*N[0]-(!Np[2*N[0]]);
}
void Dif()
{
    int T=0;
    for(int i=1;i<=Np[0];++i)
    {
        Np[i]-=N[i]+T;
        if(Np[i]<0) Np[i]+=10,T=1;
        else T=0;
    }
    while(Np[0]>1&&!Np[Np[0]]) --Np[0];
}
void Add(int x)
{
    Np[1]+=x;
    for(int i=1;Np[i]>=10;++i)
    {
        Np[i+1]+=Np[i]/10;
        Np[i]%=10;
        Np[0]=max(Np[0],i+1);
    }
}
int main()
{
    f.getline(aux,1005);
    for(int i=0;aux[i]!='\0';++i,++N[0]) N[i+1]=aux[i]-'0';
    reverse(N+1,N+N[0]+1);
    if(N[0]==1&&N[1]==1)
    {
        g<<2;
        return 0;
    }
    Sq();
    Dif();
    Add(2);
    Inm(2);
    for(int i=Np[0];i;--i) g<<Np[i];
    return 0;
}