Cod sursa(job #859209)

Utilizator ELHoriaHoria Cretescu ELHoria Data 19 ianuarie 2013 20:48:29
Problema Pascal Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <cstdio>

int R, D;
int curr[3], cond[3];
const int divs[3] = {2,3,5};
int p[3][32];

inline void getDivisors(const int &val,const int &s) {
	int j = 1;
	while(val%p[0][j] == 0) {
		j++;
		curr[0] += s;
	}
	j = 1;
	while(val%p[1][j] == 0) {
		j++;
		curr[1] += s;
	}
	j = 1;
	while(val%p[2][j] == 0) {
		j++;
		curr[2] += s;
	}
}

void compute() {
	p[0][0] = p[1][0] = p[2][0] = 1;
	for(int k = 1;k <= 25;k++) {
		p[0][k] = p[0][k - 1]*2;
	}
	for(int k = 1;k <= 16;k++) {
		p[1][k] = p[1][k - 1]*3;
		p[2][k] = p[2][k - 1]*5;
	}
}

int main()
{
	freopen("pascal.in","r",stdin);
	freopen("pascal.out","w",stdout);
	scanf("%d %d",&R,&D);
	for(int k = 0;k < 3;k++) {
		while(D%divs[k] == 0) {
			cond[k]++;
			D /= divs[k];
		}
	}
	compute();
	int ans = 0;
	int r = (R - 1)>>1;
	for(int i = 1;i <= r;i++) {
		getDivisors(R - i + 1,1);
		getDivisors(i,-1);
		ans += 2*(curr[0] >= cond[0] && curr[1] >= cond[1] && curr[2] >= cond[2]);
	}
	if(R%2 == 0) {
		r++;
		getDivisors(R - r + 1,1);
		getDivisors(r,-1);
		ans += (curr[0] >= cond[0] && curr[1] >= cond[1] && curr[2] >= cond[2]);
	}
	printf("%d\n",ans);
	return 0;
}