Cod sursa(job #113853)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 11 decembrie 2007 19:54:18
Problema Sarpe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <stdio.h>
#include <string.h>

const int N_MAX = 1024;

int N[N_MAX], rez[N_MAX * 10], aux[N_MAX * 10];
char s[N_MAX];

void mul(int A[], int B)
{
      int i, t = 0;
      for (i = 1; i <= A[0] || t; i++, t /= 10)
              A[i] = (t += A[i] * B) % 10;
      A[0] = i - 1;
}

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, j, t, C[N_MAX * 10];
      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 afis(int v[])
{
	for (int i = v[0]; i >= 1; i --) printf("%d", v[i]);
	printf("\n");
}

int main()
{
	freopen("sarpe.in", "r", stdin);
#ifndef _SCREEN_
	freopen("sarpe.out", "w", stdout);
#endif

	scanf("%s\n", s);
	int l = strlen(s), i;

	for (i = l - 1; i >= 0; i --) {
		N[++ N[0]] = s[i] - '0';
	}
	if (N[0] == 1 && N[1] == 1) {
		printf("2\n");
		return 0;
	} else {
		memcpy(rez, N, sizeof(N));
		mul(rez, 4);
		aux[0] = 1, aux[1] = 2;

		N[1] --;
		i = 1;
		while (N[i] == -1) {
			N[i] = 9;
			i ++;
			N[i] --;
		}

		MUL(aux, N);
		N[1] --;
		i = 1;
		while (N[i] == -1) {
			N[i] = 9;
			i ++;
			N[i] --;
		}

		MUL(aux, N);
		add(rez, aux);
	}

	for (i = rez[0]; i >= 1; i --) printf("%d", rez[i]);
	printf("\n");

	return 0;
}