Cod sursa(job #32148)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 17 martie 2007 13:04:27
Problema Pascal Scor 50
Compilator c Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <stdio.h>
#include <math.h>
#define FIN "pascal.in"
#define FOUT "pascal.out"

long Nr;
long prim[3] = {2,3,5};
long Exp[][3] = { {0,0,0}, {0,0,0}, {1,0,0}, {0,1,0}, {2,0,0}, {0,0,1}, {1,1,0} };
long P, D;
long numar, ok;
long nr[3], x[3];

inline long f(long x, long y) {
	long ret = 0;
	long p = y;
	for (; p<=x; p*=y) 
		ret += x/p;
	return ret;
}

void pre() {
	long i,j;
	freopen("p.txt", "w", stdout);
	for (i=0; i<2500000; ++i) {
		printf("{");
		for (j=0; j<3; ++j) {
			printf("%ld",f(i,prim[j]));
			if ( j<2 ) 
				printf(",");
		}
		printf("},");
	}
	fclose(stdout);
}

int main() {
	long i,j ;
	
	freopen(FIN, "r", stdin);
	scanf("%ld %ld", &P, &D);
	fclose(stdin);

	for (j=0; j<3; ++j) 
		nr[j] = x[j] = f(P,prim[j]);
	
	for (i=1; i<=P/2; ++i) {
		for (j=0, ok=1; j<3 && ok; ++j) 
			if ( x[j] ){
				nr[j] = x[j] - f(P-i, prim[j]) - f(i, prim[j]);
				//nr[j] += log(P-i) / log(prim[j]) - log(i) / log(prim[j]);
				if ( nr[j] < Exp[D][j] )
					ok = 0;
			}
		numar += ok;
	}

	freopen(FOUT, "w", stdout);
	printf("%ld\n", numar*2 - (P-1)%2);
	fclose(stdout);
	return 0;
}