Pagini recente » Cod sursa (job #1485043) | Cod sursa (job #2816916) | Cod sursa (job #2450437) | Cod sursa (job #3191218) | Cod sursa (job #1459615)
#include <fstream>
#define NMAX 5000001
using namespace std;
int fact2[NMAX], fact3[NMAX], fact5[NMAX];
int powInN(int n, int d)
{
int sol = 0;
if(d == 2)
while((n & 1) == 0)
{
n >>= 1;
sol++;
}
else
while(n % d == 0)
{
n /= d;
sol++;
}
return sol;
}
void calcFact(int r, int d)
{
if(d == 6)
for (int i = 1; i <= r; i++)
{
fact2[i] = fact2[i - 1] + powInN(i, 2);
fact3[i] = fact3[i - 1] + powInN(i, 3);
}
else if(d == 5)
for (int i = 1; i <= r; i++)
{
fact5[i] = fact5[i - 1] + powInN(i, 5);
}
else if(d == 2 || d == 4)
for (int i = 1; i <= r; i++)
{
fact2[i] = fact2[i - 1] + powInN(i, 2);
}
else
for (int i = 1; i <= r; i++)
{
fact3[i] = fact3[i - 1] + powInN(i, 3);
}
}
int divFact(int n, int d)
{
if(d == 2) return fact2[n];
if(d == 3) return fact3[n];
return fact5[n];
}
int power(int line, int col, int d)
{
if(d == 4)
{
return ((divFact(line, 2) - divFact(line - col, 2) - divFact(col, 2)) / 2);
}
else if(d == 6)
{
return min((divFact(line, 2) - divFact(line - col, 2) - divFact(col, 2)), (divFact(line, 3) - divFact(line - col, 3) - divFact(col, 3)));
}
else
{
return (divFact(line, d) - divFact(line - col, d) - divFact(col, d));
}
return 0;
}
int check(int line, int col, int d)
{
if(power(line, col, d))
return 1;
return 0;
}
int main()
{
int r, d;
int sol = 0;
ifstream f("pascal.in");
f >> r >> d;
f.close();
calcFact(r, d);
int lim = (r - 1) / 2;
for(int j = 0; j <= lim; j++)
sol += check(r, j, d);
sol *= 2;
if(r % 2 == 0)
sol += check(r, r / 2, d);
ofstream g("pascal.out");
g << sol << "\n";
g.close();
return 0;
}