Cod sursa(job #1471352)

Utilizator akaprosAna Kapros akapros Data 13 august 2015 17:13:49
Problema Sarpe Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#define maxN 100002
using namespace std;
int n, i, v[maxN], w[maxN], x[maxN];
char s[maxN];
void add(int A[], int B[])
{
      int i, t = 0;
      for (i = 1; i <= A[0] || i <= B[0] || t; i++, t /= 10)
              A[i] = (t += A[i] + B[i]) % 10;
      A[0] = i - 1;
}
void mul(int A[], int B)
{
    int i, t = 0;
    for (i = 1; i <= A[0] || t; ++ i)
    {
        A[i] = (t += A[i] * B) % 10;
        t /= 10;
    }
    A[0] = i - 1;
}
void mulv(int A[], int B[])
{
      int i, j, t, C[maxN];
      memset(C, 0, sizeof(C));
      for (i = 1; i <= A[0]; i++)
      {
              for (t = 0, j = 1; j <= B[0] || t; j++, t /= 10)
                      C[i + j - 1] = (t += C[i + j - 1] + A[i] * B[j]) % 10;
              if (i + j - 2 > C[0]) C[0] = i + j - 2;
      }
      memcpy(A, C, sizeof(C));
}
void sub(int A[], int B)
{
    int i, t = 0;
    A[A[0]] -= B;
    if (A[A[0]] < 0)
        t = 1,
            A[A[0]] += 10;
    for (i = A[0] - 1; i >= 1 && t; -- i)
    {
        A[i] = A[i] - t;
        if (A[i] < 0)
            t = 1,
                A[i] += 10;

    }
    while (A[A[0]] == 0 && A[0] > 0)
          -- A[0];
}
void read()
{
    freopen("sarpe.in", "r", stdin);
    gets(s); v[0] = strlen(s);
    if (s[0] == '1' && v[0] == 1)
    {
        freopen("sarpe.out", "w", stdout);
        printf("1");
        exit(0);
    }
}
void solve()
{
    for (i = 0; i < v[0]; ++ i)
        v[i + 1] = s[i] - '0';
    memcpy(w, v, sizeof(w));
    sub(w, 1);
    memcpy(x, v, sizeof(x));
    mul(v, 4);
    sub(x, 2);
    mulv(w, x);
    mul(w, 2);
    add(v, w);
}
void write()
{
    freopen("sarpe.out", "w", stdout);
    for (i = v[0]; i >= 1; -- i)
        printf("%d", v[i]);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}