Cod sursa(job #33457)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 19 martie 2007 13:47:45
Problema Pascal Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#include <cmath>
#define FIN "chernel.in"
#define FOUT "chernel.out"
#define MAX 1000000
#define PRIM_MAX 50000
#define MAXSIZE MAX/16+1
#define MAX_N 100000


long prim[PRIM_MAX], nr, ans;
long putere[PRIM_MAX];
long N,M;
char v[MAXSIZE];

void ciur(long n) {
	long i,j;
	for (i=1; ((i*i)<<1) + (i<<1) <= n; i++)
		if ( (v[i>>3] & (1<< (i&7)))==0 )
			for (j=((i*i)<<1)+(i<<1); (j<<1) + 1 <=n; j+=(i<<1) + 1)
				v[j>>3] |= (1<<(j&7));
	if ( M%2==0 ) 
		prim[nr=0] = 2;
	else
		nr=-1;
	for (i=1; (i<<1)+1<=n; ++i)
		if ( ((v[i>>3] & (1<<(i&7))) ==0) && (M%((i<<1)+1)==0) ) {
			prim[++nr] = (i<<1)+1;
		}
}


//long fact[50][MAX_N];

long f(long x, long y) {
	long ret;
	for (ret = 0; x>=y; ret+=(x/=y));
	return ret;
}

int main() {
	long i, j, ok=0;

	fscanf( fopen(FIN, "r") , "%ld %ld", &N, &M);
	N--;

	ciur((long) sqrt((double)M));

	for (i=0; i<=nr; ++i)
		for (putere[i]=0; M % prim[i]==0; putere[i]++, M/=prim[i]);
	if ( M>1 ) 
		prim[++nr]=M, putere[nr]=1;
/*
	for (j=0; j<=nr; ++j)
		for (i=1; i<=N; ++i)
			fact[j][i] = fact[j][i-1] + f(i,prim[j]);
*/	
	for (i=1; i<=N/2; ++i) {
		ok = 1;
		for (j=0; j<=nr && ok; ++j)
//			if ( putere[j] > fact[j][N] - fact[j][N-i] - fact[j][i] )
			if ( putere[j] > f(N, prim[j]) - f(N-i, prim[j]) - f(i, prim[j]))
				ok = 0;
		ans += ok;
	}
 	ans *= 2;
	if ( N%2==0 && ok )
		ans--;

	fprintf( fopen(FOUT, "w"), "%ld\n", ans);
	return 0;
}