Cod sursa(job #1757951)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 16 septembrie 2016 10:10:04
Problema Sarpe Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <cstdio>
#include <algorithm>
#include <string.h>

using namespace std;

char s[1005];
int v[3005];
int a[3005], b[3005], c[3005];

void mult(int v[], int x){
    int i,T;
    T = 0;
    for(i = 1;i <= v[0];i++){
        v[i] *= x;
        v[i] += T;
        T = v[i]/10;
        v[i] %= 10;
    }
    while(T){
        v[++v[0]] = T%10;
        T /= 10;
    }
}

void decrease(int v[], int x){
    int i,T;
    T = x;
    for(i = 1;i <= v[0];i++){
        v[i] -= T;
        if(v[i] < 0){
            v[i] += 10;
            T = 1;
        }else{
            T = 0;
        }
    }
    while(v[v[0]] == 0){
        v[0]--;
    }
}

void multMat(){
    c[0] = a[0] + b[0] - 1;
    int i,j;
    for(i = 1;i <= a[0];i++){
        for(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] += T;
        T = c[i]/10;
        c[i] %= 10;
    }
    if(T){
        c[++c[0]] = T;
    }
}

void add(){
    int i,T;
    T = 0;
    if(v[0] > c[0]){
        for(i = 0;i <= v[0];i++){
            swap(v[i], c[i]);
        }
    }
    for(i = 1;i <= c[0];i++){
        c[i] += v[i] + T;
        T = c[i]/10;
        c[i] %= 10;
    }
    if(T){
        c[++c[0]] = T;
    }
}

void Vprint(int a[]){
    int i;
    for(i = a[0];i >= 1;i--){
        printf("%d", a[i]);
    }
    printf("\n");
}

int main()
{
    freopen("sarpe.in", "r", stdin);
    freopen("sarpe.out", "w", stdout);
    int n,i;
    scanf("%s", s+1);
    n = strlen(s+1);
    for(i = 1;i <= n;i++){
        v[i] = s[i] - '0';
    }
    int j;
    for(i = 1,j = n;i < j;i++, j--){
        swap(v[i], v[j]);
    }
    v[0] = n;
    if(v[0] == 1 && v[1] == 1){
        printf("1");
        return 0;
    }
    if(v[0] == 1 && v[1] == 2){
        printf("8");
        return 0;
    }
    for(i = 0;i <= n;i++){
        a[i] = v[i];
        b[i] = v[i];
    }
    mult(v, 4);
    decrease(a, 1);
    decrease(b, 2);
    mult(a, 2);
    multMat();
    add();
    Vprint(c);
    return 0;
}