Cod sursa(job #350543)

Utilizator Addy.Adrian Draghici Addy. Data 24 septembrie 2009 16:58:43
Problema Pascal Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <stdio.h>

int r,d,sol;

int min(int a, int b) {
	return a<b?a:b;
}

void solve(int d) {
	int es,ej,e,p,k;
	es = 0;
	for (p=d; p<=r; p*=d)
			es += r/p;
	for (k=1; k<=(r-1)/2; k++) {
		ej = 0;
		for (p=d; p<=k; p*=d)
			ej += k/p;
		for (p=d; p<=r-k; p*=d)
			ej += (r-k)/p;
		e = es - ej;
		if (e)
			sol++;
	}
	sol *= 2;
	if (r%2==0) {
		k = r/2;
		ej = 0;
		for (p=d; p<=k; p*=d)
			ej += k/p;
		for (p=d; p<=r-k; p*=d)
			ej += (r-k)/p;
		e = es - ej;
		if (e)
			sol++;
	}
}

void solve4() {
	int es,ej,e,p,k;
	es = 0;
	d /= 2;
	for (p=d; p<=r; p*=d)
			es += r/p;
	for (k=1; k<=(r-1)/2; k++) {
		ej = 0;
		for (p=d; p<=k; p*=d)
			ej += k/p;
		for (p=d; p<=r-k; p*=d)
			ej += (r-k)/p;
		e = es - ej;
		if (e>=2)
			sol++;
	}
	sol *= 2;
	if (r%2==0) {
		k = r/2;
		ej = 0;
		for (p=d; p<=k; p*=d)
			ej += k/p;
		for (p=d; p<=r-k; p*=d)
			ej += (r-k)/p;
		e = es - ej;
		if (e>=2)
			sol++;
	}
}

void solve6() {
	int es2,es3,ej2,ej3,e2,e3,p,k;
	es2 = es3 = 0;
	d = 2;
	for (p=d; p<=r; p*=d)
			es2 += r/p;
	d = 3;
	for (p=d; p<=r; p*=d)
			es3 += r/p;
	for (k=1; k<=(r-1)/2; k++) {
		d = 2;
		ej2 = 0;
		for (p=d; p<=k; p*=d)
			ej2 += k/p;
		for (p=d; p<=r-k; p*=d)
			ej2 += (r-k)/p;
		e2 = es2 - ej2;
		d = 3;
		ej3 = 0;
		for (p=d; p<=k; p*=d)
			ej3 += k/p;
		for (p=d; p<=r-k; p*=d)
			ej3 += (r-k)/p;
		e3 = es3 - ej3;
		if (min(e2,e3))
			sol++;
	}
	sol *= 2;
	if (r%2==0) {
		k = r/2;
		d = 2;
		ej2 = 0;
		for (p=d; p<=k; p*=d)
			ej2 += k/p;
		for (p=d; p<=r-k; p*=d)
			ej2 += (r-k)/p;
		e2 = es2 - ej2;
		d = 3;
		ej3 = 0;
		for (p=d; p<=k; p*=d)
			ej3 += k/p;
		for (p=d; p<=r-k; p*=d)
			ej3 += (r-k)/p;
		e3 = es3 - ej3;
		if (min(e2,e3))
			sol++;
	}
	
}

int main() {
	
	FILE *f = fopen("pascal.in","r");
	FILE *g = fopen("pascal.out","w");
	
	fscanf(f,"%d%d",&r,&d);
	
	if (d==4)
		solve4();
	else
		if (d==6)
			solve6();
		else
			solve(d);
	
	fprintf(g,"%d",sol);
	
	fclose(f);
	fclose(g);
	
	return 0;
}