Cod sursa(job #67811)

Utilizator c_sebiSebastian Crisan c_sebi Data 25 iunie 2007 17:24:34
Problema Sarpe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <stdio.h>
#include <string.h>

typedef int NrMare[5000];
NrMare n, n1, aux, p, p2;

void sum(NrMare A, NrMare 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 citire(){
	int i;
	char s[5000];
	FILE *f=fopen ("sarpe.in", "r");
	fscanf (f, "%s\n", &s);
	fclose(f);
	n[0]=strlen(s);
	for (i=n[0]; i>=1; --i) n[n[0]-i+1]=s[i-1]-'0';
}

void dif (NrMare n, NrMare unu, NrMare n1) {
	int i, t=0;
	for (i=1; i<=n[0]; ++i) {
		n1[i]=n[i]-unu[i]+t;
		if (n1[i]<0)
			n1[i]+=10, t=-1;
		else t=0;
	}
	i--;
	while (i && !n1[i]) i--;
	n1[0]=i;
}

void produs (NrMare n, NrMare n1, NrMare p) {
	int i, j, t, cif;
	for (i=1; i<=n1[0]; i++){
		for (t=0, j=1; j<=n[0]; ++j){
			cif=p[i+j-1]+n[j]*n1[i]+t;
			p[i+j-1]=cif%10;
			t=cif/10;
		}
		if (t) p[i+j-1]=t;
	}
	p[0]=n[0]+n1[0]-1;
	if (p[p[0]+1]) ++p[0];
}



int main() {
	int i;
	citire();
	FILE *g=fopen ("sarpe.out", "w");
	if (n[0]==1 && n[1]==1)
		fprintf (g, "2\n");
	else {
	aux[0]=1, aux[1]=1;
	dif (n, aux, n1);  // n-1
	produs (n, n1, p); // n*(n-1)
	aux[0]=1; aux[1]=2;
	produs (p, aux, p2);  //2*n*(n-1)
	aux[0]=1; aux[1]=4;
	sum (p2, aux);    // 2*n*(n-1)+4
	for (i=p2[0]; i>=1; --i)
		fprintf (g, "%d", p2[i]);
	fprintf (g, "\n");
	}
	fclose(g);
	return 0;
}