Cod sursa(job #2022369)

Utilizator refugiatBoni Daniel Stefan refugiat Data 16 septembrie 2017 13:37:53
Problema Sarpe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream si("sarpe.in");
ofstream so("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;
    for(int i=1;i<=np[0];++i)
        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()
{
    si.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)
    {
        so<<2;
        return 0;
    }
    sq();
    dif();
    add(2);
    inm(2);
    for(int i=np[0];i;--i)
        so<<np[i];
    return 0;
}