Pagini recente » Cod sursa (job #525209) | Cod sursa (job #802861) | Cod sursa (job #119389) | Cod sursa (job #564599) | Cod sursa (job #761976)
Cod sursa(job #761976)
#include<fstream>
using namespace std;
int n,D,sol;
void Rezolvare1()
{
int i,x,p,put,lim=n/2,d;
//pentru n!
x=n;
put=0;
d=D;
while(x>=d)
{
put+=(x/d);
d*=D;
}
for(i=1;i<=lim;i++)
{
p=put;
//pentru i!
x=i;
d=D;
while(x>=d)
{
p-=(x/d);
d*=D;
}
//pentru (n-i)!
x=n-i;
d=D;
while(x>=d)
{
p-=(x/d);
d*=D;
}
//trebuie ca D sa apara la o putere > 0
if(p>0)
{
sol+=2;
if(2*i==n)
sol--;
}
}
}
void Rezolvare2()
{
int i,x,p,put,lim=n/2,d;
//pentru n!
x=n;
put=0;
d=2;
while(x>=d)
{
put+=(x/d);
d*=2;
}
for(i=1;i<=lim;i++)
{
p=put;
//pentru i!
x=i;
d=2;
while(x>=d)
{
p-=(x/d);
d*=2;
}
//pentru (n-i)!
x=n-i;
d=2;
while(x>=d)
{
p-=(x/d);
d*=2;
}
//trebuie ca sa 2 sa apara la o putere > 1
if(p>1)
{
sol+=2;
if(2*i==n)
sol--;
}
}
}
void Rezolvare3()
{
int i,x,p2,p3,put2,put3,lim=n/2,d;
//pentru n! cu D=2
x=n;
put2=0;
d=2;
while(x>=d)
{
put2+=(x/d);
d*=2;
}
//pentru n! cu D=3
x=n;
put3=0;
d=3;
while(x>=d)
{
put3+=(x/d);
d*=3;
}
for(i=1;i<=lim;i++)
{
p2=put2;
//pentru i! cu D=2
x=i;
d=2;
while(x>=d)
{
p2-=(x/d);
d*=2;
}
//pentru (n-i)! cu D=2
x=n-i;
d=2;
while(x>=d)
{
p2-=(x/d);
d*=2;
}
p3=put3;
//pentru i! cu D=3
x=i;
d=3;
while(x>=d)
{
p3-=(x/d);
d*=3;
}
//pentru (n-i)! cu D=3
x=n-i;
d=3;
while(x>=d)
{
p3-=(x/d);
d*=3;
}
//trebuie ca sa 2 si 3 sa apara la o putere > 0
if(p2>0 && p3>0)
{
sol+=2;
if(2*i==n)
sol--;
}
}
}
int main()
{
ifstream fin("pascal.in");
fin>>n>>D;
fin.close();
if(D==2 || D==3 || D==5)
Rezolvare1();
if(D==4)
Rezolvare2();
if(D==6)
Rezolvare3();
ofstream fout("pascal.out");
fout<<sol<<"\n";
fout.close();
return 0;
}