Cod sursa(job #1235811)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 30 septembrie 2014 18:43:12
Problema Pascal Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include<cstdio>
#include<iostream>
using namespace std;

int dp[2], f[2], F[2], Left[2], Right[2];
int R, D, P, i, j, d, sol;

int main() {
    freopen("pascal.in", "r", stdin);
	freopen("pascal.out", "w", stdout);

	scanf("%d %d", &R, &D);

	for (d = 2 ; d <= D ; d++) {
		if (D % d == 0) {
			dp[P] = d;
			while (D % d == 0) { f[P]++; D /= d; }
			P++;
		}
	}
	
	for (i = 0 ; i < P ; i++) {
		d = dp[i];
		while (d <= R) {
			int aux = R;
			while (aux % d == 0) { F[i]++; aux /= d; }
			d *= dp[i];
		}
	}

	int M = R >> 1;
	for (i = 0 ; i < P ; i++) 
		Left[i] = 0, Right[i] = F[i];
	
	bool last = false;
	for (j = 0 ; j <= M ; j++) {
		bool ok = true;
		for (i = 0 ; i < P ; i++) {
            int r = F[i] - Left[i] - Right[i];
			if (r < f[i]) ok = false;
			
			d = dp[i];
			int aux = j + 1;
			while (aux % d == 0) { Left[i]++; aux /= d; }
			aux = R - j;
			while (aux % d == 0) { Right[i]--; aux /= d; }
		}
		if (ok) { sol++; if (j == M) last = true; }
	}

	sol <<= 1;

    if (!(R&1) && last) sol--;
	printf("%d\n", sol);

	return 0;
}