Pagini recente » Cod sursa (job #1038957) | Cod sursa (job #411361) | Cod sursa (job #2946459) | Cod sursa (job #8886) | Cod sursa (job #811793)
Cod sursa(job #811793)
#include <fstream>
using namespace std;
const char InFile[]="pascal.in";
const char OutFile[]="pascal.out";
const int MaxR=5000111;
ifstream fin(InFile);
ofstream fout(OutFile);
int n,d,p2,p3,p5,r2,r3,r5,sol,tr2,tr3,tr5,legendre2[MaxR],legendre3[MaxR],legendre5[MaxR];
inline int legendre(int x,int p)
{
int sol(0);
int pp=p;
while(x/pp)
{
sol+=x/pp;
pp*=p;
}
return sol;
}
int main()
{
fin>>n>>d;
fin.close();
while(d%2==0)
{
++r2;
d/=2;
}
while(d%3==0)
{
++r3;
d/=3;
}
while(d%5==0)
{
++r5;
d/=5;
}
for(register int i=2;i<=((n+1)>>1)+1;++i)
{
legendre2[i]=legendre(i,2);
legendre3[i]=legendre(i,3);
legendre5[i]=legendre(i,5);
}
tr2=legendre(n,2);
tr3=legendre(n,3);
tr5=legendre(n,5);
for(register int j=1;j<(n+1)>>1;++j)
{
p2=tr2-legendre2[j]-legendre2[n-j];
p3=tr3-legendre3[j]-legendre3[n-j];
p5=tr5-legendre5[j]-legendre5[n-j];
if(p2>=r2 && p3>=r3 && p5>=r5)
{
sol+=2;
}
}
if((n-1)%2==1)
{
int j=((n+1)>>1)+1;
p2=tr2-legendre2[j]-legendre2[n-j];
p3=tr3-legendre3[j]-legendre3[n-j];
p5=tr5-legendre5[j]-legendre5[n-j];
if(p2>=r2 && p3>=r3 && p5>=r5)
{
++sol;
}
}
fout<<sol;
fout.close();
return 0;
}