Cod sursa(job #799513)

Utilizator SteveStefan Eniceicu Steve Data 19 octombrie 2012 10:06:34
Problema Pascal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <fstream>

using namespace std;

inline int min (int a, int b) {
	return a > b ? b : a;
}

inline int max (int a, int b) {
	return a > b ? a : b;
}

int gf(int nr, int d)
{
	int i;
	for(i=0; ((nr%d == 0) && nr); i++) nr = nr/d;
	return i;
}

int main()
{
	int r, d;
	int j, a1, a2;
	int x2, x3, x5, cnt, i;
	ifstream fin("pascal.in");
	ofstream fout("pascal.out");
	fin>>r; fin>>d;
	x2 = 0; x3 = 0; x5 = 0; cnt = 0;
	for(i=0; i < (r >> 1); i++)
	{
		a1 = r-i;
		a2 = i+1;
		if(!(d & 1))
		{
			for(j=0; (!(a1 & 1)) && a1; j++) a1 = a1 >> 1;
			x2 = x2 + j;
			for(j=0; (!(a2 & 1)) && a2; j++) a2 = a2 >> 1;
			x2 = x2 - j;
			if(d == 2) if(x2 > 0) cnt++;
			if(d == 4) if(x2 > 1) cnt++;
		}
		if(d % 3 == 0)
		{
			for(j=0; ((a1%3 == 0) && (a1)); j++) a1 = a1/3;
			x3 = x3 + j;
			for(j=0; ((a2%3 == 0) && (a2)); j++) a2 = a2/3;
			x3 = x3 - j;
			if(d == 3) if (x3 > 0) cnt++;
			if(d == 6) if (min (x2, x3) > 0) cnt++;
			continue;
		}
		if (d % 5 == 0)
		{
			for (j=0; ((a1%5 == 0) && (a1)); j++) a1 = a1/5;
			x5 = x5 + j;
			for (j=0; ((a2%5 == 0) && (a2)); j++) a2 = a2/5;
			x5 = x5 - j;
			if (d == 5) if (x5 > 0) cnt++;
			continue;
		}
	}
	cnt = cnt << 1;
	if(!(r & 1))
	{
		x2 = x2 + gf(r-i, 2);
		x3 = x3 + gf(r-i, 3);
		x5 = x5 + gf(r-i, 5);
		x2 = x2 - gf(i+1, 2);
		x3 = x3 - gf(i+1, 3);
		x5 = x5 - gf(i+1, 5);
		if(d == 2) if(x2 > 0) cnt--;
		if(d == 3) if(x3 > 0) cnt--;
		if(d == 4) if(x2 > 1) cnt--;
		if(d == 5) if(x5 > 0) cnt--;
		if(d == 6) if(min(x2, x3) > 0) cnt--;
	}
	fout<<cnt;
	return 0;
}