Cod sursa(job #148470)

Utilizator tvladTataranu Vlad tvlad Data 4 martie 2008 13:11:27
Problema Sarpe Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>
#include <cstring>

const int NC = 1000010;
int n[NC], t[NC], r[NC];

void scan ( int a[] ) {
	char *s = new char[NC];
	fgets(s,NC,stdin);
	int i;
	for (i = 0; s[i] != '\n'; ++i) {
		a[i+1] = s[i]-'0';
	}
	a[0] = i;
}

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

void add ( int a[], int b[], int c[] ) {
	int i, t = 0;
	for (i = 1; i <= a[0] || i <= b[0] || t; i++, t /= 10)
		c[i] = (t += a[i] + b[i]) % 10;
	c[0] = i - 1;
}

void dec ( int a[] ) {
	int i, t = 0;
	a[1] += (t = (a[1] -= 1 + t) < 0) * 10;
	for (i = 1; i <= a[0]; i++)
		a[i] += (t = (a[i] -= t) < 0) * 10;
	for (; a[0] > 1 && !a[a[0]]; a[0]--);
}

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

void mul ( int a[], int b[], int c[] ) {
	int i, j, t;
	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;
	}
}

int main() {
	freopen("sarpe.in","rt",stdin);
	freopen("sarpe.out","wt",stdout);
	scan(n);
	if (n[0] == 1 && n[1] == 1) {
		printf("2\n");
		return 0;
	} else
	if (n[0] == 1 && n[1] == 2) {
		printf("8\n");
		return 0;
	}
	mul(n,4,r);
	dec(n);
	mul(n,2,t);
	dec(n);
	mul(t,n,t);
	add(r,t,r);
	print(r);
}