Pagini recente » Cod sursa (job #727001) | Cod sursa (job #509877) | Cod sursa (job #2723127) | Cod sursa (job #2275278) | Cod sursa (job #3306179)
#include <bits/stdc++.h>
#define MAX 5000000
using namespace std;
int putere_2[MAX+1], putere_3[MAX+1], putere_5[MAX+1]; ///puterile lui 2, 3 si 5 din descompunerea in factori primi ale fiecarui factorial pana la 5 000 000
void precalc() ///precalculam vectorii putere_2, putere_3 si putere_5
{
int putere=1;
while(putere<=MAX) ///calculam puterea lui 2 din descompunerea fiecarui numar pana la 5 000 000
{
for(int p=putere; p<=MAX; p+=putere)
putere_2[p]++;
putere*=2;
}
for(int i=1; i<=MAX; i++) ///calculam puterea lui 2 din descompunerea fiecarui factorial (insumand puterile lui 2 din fiecare numar)
putere_2[i]+=putere_2[i-1];
///analog si pentru puterile lui 3 si 5
putere=1;
while(putere<=MAX)
{
for(int p=putere; p<=MAX; p+=putere)
putere_3[p]++;
putere*=3;
}
for(int i=1; i<=MAX; i++)
putere_3[i]+=putere_3[i-1];
putere=1;
while(putere<=MAX)
{
for(int p=putere; p<=MAX; p+=putere)
putere_5[p]++;
putere*=5;
}
for(int i=1; i<=MAX; i++)
putere_5[i]+=putere_5[i-1];
}
bool verif(int i, int j, int d) ///verifica daca i!/((i-j)!*j!) este divizibil cu d
{
///fiindca d este maxim 6, vom lua fiecare caz in parte
if(d==2)
{
if(putere_2[i]-putere_2[i-j]-putere_2[j]>=1)
return 1;
}
else if(d==3)
{
if(putere_3[i]-putere_3[i-j]-putere_3[j]>=1)
return 1;
}
else if(d==4)
{
if(putere_2[i]-putere_2[i-j]-putere_2[j]>=2)
return 1;
}
else if(d==5)
{
if(putere_5[i]-putere_5[i-j]-putere_5[j]>=1)
return 1;
}
else if(d==6)
{
if(putere_2[i]-putere_2[i-j]-putere_2[j]>=1 && putere_3[i]-putere_3[i-j]-putere_3[j]>=1)
return 1;
}
return 0;
}
int main()
{
ifstream in("pascal.in");
ofstream out("pascal.out");
precalc();
int r, d;
in >> r >> d;
int nr_divizibile=0; ///numarul de numere de pe randul r divizibile cu d
for(int j=0; j<=r; j++)
{
if(verif(r, j, d)==1)
nr_divizibile++;
}
out << nr_divizibile;
return 0;
}