Pagini recente » Cod sursa (job #1824315) | Cod sursa (job #2743473) | Cod sursa (job #20892) | Cod sursa (job #1413951) | Cod sursa (job #1249018)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
inline int max_pow(int& n, int div) {
int sol = 0;
while (n % div == 0) {
sol++;
n /= div;
}
return sol;
}
void decompose(int b, std::vector<std::pair<int, int> >& pdiv) {
if (int p2 = max_pow(b, 2)) {
pdiv.push_back(std::make_pair(2, p2));
}
for (int i = 3; i <= sqrt(b); i += 2) {
if (int p = max_pow(b, i)) {
pdiv.push_back(std::make_pair(i, p));
}
}
if (b != 1) {
pdiv.push_back(std::make_pair(b, 1));
}
}
inline long long fact_count(int n, int pdiv) {
long long sol =
((long long)pdiv) * (n / pdiv) * (n / pdiv + 1) * (n / pdiv + 2) / 6;
if (n % pdiv != pdiv - 1) {
sol -= ((long long)(pdiv - 1 - n % pdiv)) * (n / pdiv) * (n / pdiv + 1) / 2;
}
return sol;
}
int main()
{
std::ifstream in("zero2.in");
std::ofstream out("zero2.out");
for (int test = 0; test < 10; ++test) {
int n, b;
in >> n >> b;
std::vector<std::pair<int, int> > pdiv;
decompose(b, pdiv);
// And now go in an count.
std::vector<long long> pn;
for (int i = 0; i < pdiv.size(); ++i) {
pn.push_back(fact_count(n, pdiv[i].first));
}
// And now go in an compute the least.
long long solmin;
for (int i = 0; i < pdiv.size(); ++i) {
if (i == 0 || solmin > pn[i] / pdiv[i].second) {
solmin = pn[i] / pdiv[i].second;
}
}
out << solmin << std::endl;
}
in.close();
out.close();
return 0;
}