Cod sursa(job #2332898)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 31 ianuarie 2019 13:20:18
Problema Sarpe Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <fstream>
#include <cstring>
#define DIM 1000000
using namespace std;

ifstream fin ("sarpe.in");
ofstream fout ("sarpe.out");
int a[DIM],v[DIM],sol[DIM],x[DIM];
int i;
char s[DIM];
void inmultire (int c[],int a[],int b){
    int t = 0;
    for (int i=1;i<=a[0];i++){
        c[i] = a[i]*b+t;
        t = c[i]/10;
        c[i] %= 10;
    }
    c[0] = a[0];
    while (t){
        c[++c[0]] = t%10;
        t /= 10;
    }
}
void scade (int v[]){
    int i = 1;
    while (i <= v[0] && v[i] == 0){
        v[i] = 9;
        i++;
    }
    v[i]--;
    if (i == v[0] && v[i] == 0)
        v[0]--;
}
void inmultire_mare (int c[],int a[],int b[]){
    c[0] = a[0]+b[0]-1;
    for (int i=1;i<=a[0]+b[0];i++)
        c[i] = 0;
    for (int i=1;i<=a[0];i++)
        for (int j=1;j<=b[0];j++)
            c[i+j-1] += a[i]*b[j];
    int t = 0;
    for (i=1;i<=c[0];i++){
        c[i] = c[i] + t;
        t = c[i] / 10;
        c[i] %= 10;
    }
    while (t){
        c[++c[0]] = t%10;
        t /= 10;
    }
}
void aduna (int c[],int a[],int b[]){
    int m;
    if (a[0] > b[0]){
        m = a[0];
        for (int i=b[0]+1;i<=m;i++)
            b[i] = 0;
    } else {
        m = b[0];
        for (int i=a[0]+1;i<=m;i++)
            a[i] = 0;
    }
    int t = 0;
    for (int i=1;i<=m;i++){
        c[i] = a[i] + b[i] + t;
        t = c[i] / 10;
        c[i] %= 10;
    }
    c[0] = m;
    while (t){
        c[++c[0]] = t%10;
        t /= 10;
    }
}
int main (){

    fin>>s+1;
    v[0] = strlen (s+1);
    for (i=1;i<=v[0];i++)
        v[v[0]-i+1] = s[i]-'0';

    if (v[0] == 1 && v[1] == 1){
        fout<<1;
        return 0;
    }

    for (i=1;i<=v[0];i++)
        a[i] = v[i];
    a[0] = v[0];
    /// 4*n + 2*(n-1)*(n-2)
    inmultire (sol,a,4);

    /// scadem 1
    scade (v);
    inmultire(v,v,2);

    scade (a);
    scade (a);

    inmultire_mare (x,v,a);
    aduna (sol,sol,x);

    for (i=sol[0];i>=1;i--)
        fout<<sol[i];

    return 0;
}