Cod sursa(job #142855)

Utilizator scvalexAlexandru Scvortov scvalex Data 25 februarie 2008 14:28:09
Problema Pascal Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <iostream>
#include <fstream>

using namespace std;

int R,
	D, DD;

long pN, pN6, pK, pNK;

int nrdiv(int n, int D) {
	if (4 == D)
		D = 2;

	int r(0);
	for (long i = D; i <= n; i *= D) 
		r += n / i;

	return r;
}

int main(int argc, char *argv[]) {
	ifstream fin("pascal.in");
	fin >> R >> D;
	fin.close();

	//cout << R << " " << D << endl;

	if (6 != D)
		pN = nrdiv(R, D);
	else {
		pN = nrdiv(R, 2);
		pN6 = nrdiv(R, 3);
	}
	//cout << pN << endl;

	DD = D;
	if (4 == D)
		DD = 2;

	long res(0),
		 vah;
	int aux, i;
	pK = 0;
	pNK = pN;
	for (int k(1); k <= R / 2; ++k) {
		if (6 != D) {
			/*pK = nrdiv(k, D);
			pNK = nrdiv(R - k, D);*/

			aux = k;
			i = 0;
			while (aux % DD == 0) {
				aux /= DD;
				++i;
			}
			pK += i;

			aux = R - k + 1;
			i = 0;
			while (aux % DD == 0) {
				aux /= DD;
				++i;
			}
			pNK -= i;

			vah = pN - pK - pNK;
			if (4 == D)
				vah /= 2;
		} else {
			pK = nrdiv(k, 2);
			pNK = nrdiv(R - k, 2);
			vah = pN - pK - pNK;

			if (vah) {
				pK = nrdiv(k, 3);
				pNK = nrdiv(R - k, 3);
				vah = pN6- pK - pNK;
			}
		}
		//cout << k << " " << pK << " " << pNK << " -> " << vah << endl;
		if (vah)
			if ((R % 2 == 0) && (k == R / 2))
				++res;
			else
				res += 2;
	}

	ofstream fout("pascal.out");
	fout << res << endl;
	fout.close();

	return 0;
}