Pagini recente » Cod sursa (job #738195) | Cod sursa (job #816168) | Cod sursa (job #103562) | Cod sursa (job #1056431) | Cod sursa (job #789225)
Cod sursa(job #789225)
#include <fstream>
#include <iostream>
using namespace std;
ifstream fi("pascal.in");
ofstream fo("pascal.out");
int *dfact;
int compute(int R, int D)
{
int c = 0, nd;
for(int i = 0; i < (R + 1) / 2; i++)
{
nd = dfact[R] - dfact[R - i] - dfact[i];
if(nd > 0) c++;
}
c *= 2;
if(R % 2 == 0)
{
nd = dfact[R] - dfact[R - R / 2] - dfact[R / 2];
if(nd > 0) c++;
}
return c;
}
int P2[32] = {0};
int P3[32] = {0};
int P5[32] = {0};
void prepow(int d, int r, int *P)
{
int p = d;
int i = 0;
while(p <= r)
{
P[i++] = p;
p *= d;
}
i = 0;
}
inline int df(int x, int d, int *P)
{
int c(0), i(0);
while(P[i] > 0)
c += (x / P[i++]);
return c;
}
inline int max(int a, int b)
{
if(a > b) return a;
return b;
}
inline int df(int x, int d)
{
if(d == 2) return df(x, d, P2);
if(d == 3) return df(x, d, P3);
if(d == 4) return df(x, d, P2) / 2;
if(d == 5) return df(x, d, P5);
if(d == 6) return max(df(x, d, P2), df(x, d, P3));
return -1;
}
void pre(int R, int D)
{
prepow(2, R, P2);
prepow(3, R, P3);
prepow(5, R, P5);
dfact = new int[R + 1];
for(int i = 0; i <= R; i++)
{
dfact[i] = df(i, D);
}
}
int main(int argc, char *argv[])
{
int R, D;
fi >> R >> D;
pre(R, D);
fo << compute(R, D) << endl;
fi.close();
fo.close();
return 0;
}