Cod sursa(job #68925)

Utilizator zobicaMarin Marin zobica Data 30 iunie 2007 01:18:41
Problema Pascal Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <fstream>

using namespace std;

long r, d, s[2000000], s1[2000000];

void citire() {
	ifstream fin("pascal.in");
	fin >> r >> d;
	fin.close();
}

void factori_primi(long s[], int d)  {
	for (int i = 1; i <=r; i ++) {
		s[i] = 0;
		for (long p = d; p <= i; p*=d)
			s[i] += i/p;
	}
}

int divizor (long r, long n) {
	switch (d) {
		case 2 :
		case 3 :
		case 5 :			
			return (s[r] - s[r - n] - s[n] > 0);
			break;										   
		case 4 : 
			return (s[r] - s[r - n] - s[n] > 1);
			break;				
		case 6 :
			return (s[r] - s[r - n] - s[n] > 0 && s1[r] - s1[r - n] - s1[n] > 0);
	}
}

long numar() {
	long nr = 0;
	for (long i = 1; i < (( r + 1) >> 1); i++)
		nr += divizor(r, i);
	nr <<= 1;
	if ( (r & 1) == 0 )
		nr += divizor(r, (r >> 1));

	return nr;
}

int main() {
	citire();
	if (d != 6 && d != 4)
		factori_primi(s, d);
	else 
		if (d == 4 )
			factori_primi(s, 2);
		else {
			factori_primi(s, 2);
			factori_primi(s1, 3);
		}

		ofstream fout("pascal.out");
		fout << numar();
		fout.close();

		return 0;
}