Cod sursa(job #48278)

Utilizator mika17Mihai Alex Ionescu mika17 Data 4 aprilie 2007 16:56:49
Problema Pascal Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <stdio.h>
#define fin "pascal.in"
#define fout "pascal.out"
#define MAXF 2 // ~ lglgD

struct factor {int nr,pow;} fact[MAXF];
int N,D;

int getpow(int & n,int d)
{
	int sol=0;
	while(n%d==0)
		++sol , n/=d;
        return sol;
}

void factorize()
{
	int i=0,k=2;
	while(D>1)
	{
		if(D%k==0)
		{
			fact[i].nr = k;
			fact[i++].pow = getpow(D,k);

		}
		++k;
	}
}

int getsol()
{
 int factC[MAXF],sol=0,j;
 factC[0] = factC[1] = 0;
 for(int i = 1;i<=N/2;++i)
 {
	 int n1=N-i+1,n2=i,nfact=0;
	 for(j=0;fact[j].nr;++j)
	 {
		factC[j] = factC[j] + getpow(n1,fact[j].nr) - getpow(n2,fact[j].nr);
		if(fact[j].pow<=factC[j]) ++nfact;
	 }
	 if(nfact!=j) continue;
	 if(i==(N/2 + N%2)) ++sol;
	  else sol+=2;
 }
 return sol;
}


int main()
{
	freopen(fin,"r",stdin);
	freopen(fout,"w",stdout);
	scanf("%d %d", &N, &D);
	factorize();
	printf("%d",getsol());
	return 0;
}