Cod sursa(job #2809608)

Utilizator alextmAlexandru Toma alextm Data 27 noiembrie 2021 11:25:01
Problema Pascal Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("pascal.in");
ofstream fout("pascal.out");

const int MAXN = 5000001;

int Exp[6][MAXN]; // Exp[d][i] = Exponentul lui d din descompunerea lui i

int main() {
	int R, D, c2, c3, c5, total, E2, E3, E5;
	fin >> R >> D;

	// Base-case
	Exp[2][2] = Exp[3][3] = Exp[5][5] = 1;

	for(int i = 2; i <= R; i++) {
		if(i % 2 == 0)
			Exp[2][i] = Exp[2][i / 2] + 1;
		if(i % 3 == 0)
			Exp[3][i] = Exp[3][i / 3] + 1;
		if(i % 5 == 0)
			Exp[5][i] = Exp[5][i / 5] + 1;
	}

	// Sume partiale pentru factoriale
	for(int i = 2; i <= R; i++) {
		Exp[2][i] += Exp[2][i-1];
		Exp[3][i] += Exp[3][i-1];
		Exp[5][i] += Exp[5][i-1];
	}

	// Vedem cum se descompune D
	c2 += (D % 2 == 0);
	c3 += (D % 3 == 0);
	c2 += (D % 4 == 0);
	c5 += (D % 5 == 0);

	total = E2 = E3 = E5 = 0;
	for(int i = 1; i <= R; i++) { // Incercam sa simplificam formula de combinari
		E2 = Exp[2][R] - Exp[2][i] - Exp[2][R-i];
		E3 = Exp[3][R] - Exp[3][i] - Exp[3][R-i];
		E5 = Exp[5][R] - Exp[5][i] - Exp[5][R-i];
		total += (E2 >= c2 && E3 >= c3 && E5 >= c5);
	}

	fout << total << "\n";

	return 0;
}