Cod sursa(job #865906)

Utilizator ELHoriaHoria Cretescu ELHoria Data 27 ianuarie 2013 11:35:32
Problema Pascal Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 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;
    }
}

inline bool isDivisible() {
	if(D == 5) {
		return (curr[2] > 0);
	}
	return (curr[0] >= cond[0] && curr[1] >= cond[1]);
}
 
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*isDivisible();
    }
    if(R%2 == 0) {
        r++;
        getDivisors(R - r + 1,1);
        getDivisors(r,-1);
		ans += isDivisible();
    }
    printf("%d\n",ans);
    return 0;
}