Cod sursa(job #791966)

Utilizator vld7Campeanu Vlad vld7 Data 25 septembrie 2012 22:16:17
Problema Pascal Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#include <algorithm>

using namespace std;

FILE *f = fopen ("pascal.in","r");
FILE *g = fopen ("pascal.out","w");

int R;
long long power[6][1000005], sol;

void precompute()
{
	for (int i = 2, cnt = 1; i <= 1000000; i *= 2)
		power[2][cnt++] = i;
	for (int i = 3, cnt = 1; i <= 1000000; i *= 3)
		power[3][cnt++] = i;
	for (int i = 5, cnt = 1; i <= 1000000; i *= 5)
		power[5][cnt++] = i;
}

int getPower(int k, int D)
{
	int rez = 0, cnt;
	
	cnt = 1;
	while ((R / power[D][cnt]) > 0) {
		rez += R / power[D][cnt];
		cnt++;
	}
		
	cnt = 1;
	while ((k / power[D][cnt]) > 0) {
		rez -= k / power[D][cnt];
		cnt++;
	}
		
	cnt = 1;
	while ((R - k) / power[D][cnt] > 0) {
		rez -= (R - k) / power[D][cnt];
		cnt++;
	}
	
	return rez;
}

int main()
{
	int D;
	
	fscanf (f, "%d%d", &R, &D);
	precompute();
	for (int k = 1; k < R; k++) {
		if (D == 4) {
			int p = getPower(k, 2);
			if (p / 2 > 0)
				sol++;
		}
		else if (D == 6) {
			int p = getPower(k, 2);
			int q = getPower(k, 3);
			if (min(p, q) > 0)
				sol++;
		}
		else {
			int p = getPower(k, D);
			if (p > 0)
				sol++;
		}
	}
	
	fprintf (g, "%lld\n", sol);
	
	fclose(f);
	fclose(g);
	
	return 0;
}